使用lxml,导致“lxml.etree.XMLSyntaxError:Document is empty”错误的原因是什么?

时间:2011-01-09 23:00:47

标签: python xml mechanize lxml

我正在使用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

之后我得到root并在文档中搜索我想要的值。显然iterparse不会崩溃它,但目前我假设它不仅仅是因为我没有用它处理任何东西。另外,我还没有弄清楚如何用它来搜索它们。

我已经尝试禁用gzip并启用发送引用,但都没有解决问题。我也尝试将源代码保存到磁盘并从那里创建树只是为了它,我得到了同样的错误。

修改
我得到的响应似乎没问题,使用print repr(响应),建议我得到<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:Entity'rsquo'未定义,第17行,第7054行”。到目前为止,我已经用正则表达式替换它,但是有一个解析器可以处理这个吗?即使使用下面建议的lxml.html.parse,我也会收到此错误。

关于正在突出显示的文件,我的意思是当我用gEdit打开它时它会这样做:http://img34.imageshack.us/img34/9574/gedit.jpg

2 个答案:

答案 0 :(得分:3)

使用lxml.html.parse for html它可以处理甚至非常破碎的html,你仍然会收到错误吗?

答案 1 :(得分:1)

response的性质是什么?根据帮助,etree.parse期待以下之一:

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