Используя lxml, что вызывает ошибку «lxml.etree.XMLSyntaxError: Document is empty»? - PullRequest
4 голосов
/ 10 января 2011

Я использую mechanize / cookiejar / lxml для чтения страницы, и она работает для некоторых, но не для других.Ошибка, которую я получаю в них, та, что в названии.Я не могу опубликовать страницы здесь, потому что они не SFW, но есть ли способ это исправить?По сути, это то, что я делаю:

import mechanize, cookielib
from lxml import etree    

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(False)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 maverick Firefox/3.6.13')]

response = br.open('...')
tree = etree.parse(response) #error

После этого я получаю рут и ищу в документе нужные мне значения.Очевидно, iterparse не дает сбой, но в настоящий момент я предполагаю, что это не только потому, что я ничего не обработал с ним.Кроме того, я еще не выяснил, как с ним искать.

Я пытался отключить gzip и включить отправку реферера, но ни одна из них не решает проблему.Я также попытался сохранить исходный код на диск и создать дерево оттуда только ради него, и я получаю ту же ошибку.

edit
Полученный ответ кажетсявсе в порядке, используя print repr (response), как предложено, я получаю <response_seek_wrapper at 0xa4a160c whose wrapped object = <stupid_gzip_wrapper at 0xa49acec whose fp = <socket._fileobject object at 0xa49c32c>>>.Я также могу сохранить ответ, используя метод read (), и проверить, что сохраненный .xml работает в браузере и во всем.

Кроме того, на одной из страниц есть &rsquo;, который дает мнеследующая ошибка: «lxml.etree.XMLSyntaxError: объект« rsquo »не определен, строка 17, столбец 7054».До сих пор я заменил его регулярным выражением, но есть ли анализатор, который может справиться с этим?Я получил эту ошибку даже с предложенным ниже lxml.html.parse.

Что касается подсвечиваемого файла, я имел в виду, что когда я открываю его с помощью gEdit, он делает следующее: http://img34.imageshack.us/img34/9574/gedit.jpg

Ответы [ 2 ]

3 голосов
/ 10 января 2011

используйте lxml.html.parse для html, он может обрабатывать даже очень испорченный html, тогда вы все равно получаете ошибку?

1 голос
/ 10 января 2011

Какова природа response? Согласно справке, etree.parse ожидает одно из:

   - a file name/path
   - a file object
   - a file-like object
   - a URL using the HTTP or FTP protocol
...