使用lxml时,什么导致“lxml.etree.XMLSyntaxError: 文档为空”错误?
我正在使用 mechanize、cookiejar 和 lxml 来读取网页,这在某些页面上能正常工作,但在其他页面上却不行。我遇到的错误就是标题中提到的那种。我不能在这里贴出这些页面,因为它们不适合所有人查看,但有没有办法解决这个问题?基本上,我的操作是这样的:
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 并启用发送来源网址,但这两者都没有解决问题。我还尝试将源代码保存到磁盘上,然后从那里创建树,仅仅是为了试试,结果还是出现同样的错误。
编辑
我得到的响应似乎没问题,按照建议使用 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 文件在浏览器中是否能正常工作,一切都好。
另外,在其中一个页面中,有一个 ’
,这让我遇到了以下错误:“lxml.etree.XMLSyntaxError: Entity 'rsquo' not defined, line 17, column 7054”。到目前为止,我用正则表达式替换了它,但有没有解析器可以处理这个问题?即使使用下面建议的 lxml.html.parse,我也遇到了这个错误。
关于被高亮的文件,我是说当我用 gEdit 打开它时,它会这样显示:http://img34.imageshack.us/img34/9574/gedit.jpg
2 个回答
response
的本质是什么?根据帮助文档,etree.parse 期待接收到以下其中一种内容:
- a file name/path
- a file object
- a file-like object
- a URL using the HTTP or FTP protocol
可以使用 lxml.html.parse 来处理 HTML,即使是那些非常糟糕的 HTML 代码,它也能应付得了。如果你还是遇到错误,那是怎么回事呢?