2014-10-02 4 views
5

В документации сказано, я могу:Могу ли я предоставить URL-адрес lxml.etree.parse на Python 3?

LXML может разобрать из локального файла, с HTTP URL или FTP URL. Он также автоматически обнаруживает и читает gzip-сжатые XML-файлы (.gz).

(от http://lxml.de/parsing.html под «Парсеры»)

но быстрый эксперимент, кажется, подразумевает обратное:

Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from lxml import etree 
>>> parser = etree.HTMLParser() 
>>> from urllib.request import urlopen 
>>> with urlopen('https://pypi.python.org/simple') as f: 
... tree = etree.parse(f, parser) 
... 
>>> tree2 = etree.parse('https://pypi.python.org/simple', parser) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lxml.etree.pyx", line 3299, in lxml.etree.parse (src\lxml\lxml.etree.c:72655) 
    File "parser.pxi", line 1791, in lxml.etree._parseDocument (src\lxml\lxml.etree.c:106263) 
    File "parser.pxi", line 1817, in lxml.etree._parseDocumentFromURL (src\lxml\lxml.etree.c:106564) 
    File "parser.pxi", line 1721, in lxml.etree._parseDocFromFile (src\lxml\lxml.etree.c:105561) 
    File "parser.pxi", line 1122, in lxml.etree._BaseParser._parseDocFromFile (src\lxml\lxml.etree.c:100456) 
    File "parser.pxi", line 580, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:94543) 
    File "parser.pxi", line 690, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:96003) 
    File "parser.pxi", line 618, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:95015) 
OSError: Error reading file 'https://pypi.python.org/simple': failed to load external entity "https://pypi.python.org/simple" 
>>> 

я могу использовать urlopen метод, но документация кажется, подразумевает, что пропускание URL-адрес как-то лучше. Кроме того, я немного обеспокоен тем, что полагаюсь на lxml, если документация неточна, особенно если я начну делать что-то более сложное.

Каков правильный способ анализа HTML с помощью lxml, с известного URL-адреса? И где я должен смотреть, чтобы это документировано?

Update: Я получаю ту же ошибку, если я использую http URL, а не https один.

+1

это работает для ** HTTP ** URL, а не HTTPS. – isedev

+0

Нет, http не удается, такая же ошибка. Извините, я должен был сказать, что (хотя и не поддерживает HTTPS, позволяет использовать URL-адрес немного небезопасно :-() –

+0

попробуйте с 'www.google.com', например, он работает для меня. – isedev

ответ

8

Проблема в том, что lxml не поддерживает HTTPS-ссылки, а http://pypi.python.org/simple перенаправляет на версию HTTPS.

Так что для любого защищенного веб-сайта, вы должны прочитать URL-адрес себя:

from lxml import etree 
from urllib.request import urlopen 

parser = etree.HTMLParser() 

with urlopen('https://pypi.python.org/simple') as f: 
    tree = etree.parse(f, parser) 
Смежные вопросы