猿问

为什么lxml有时(但不常见)在Python中吐出错误?

我经常lxml在Python中使用模块从某些网站上抓取数据,并且我对模块总体上感到满意。但是,当我尝试抓取时,有时会lxml.etree.XMLSyntaxError: AttValue: " or ' expectedetree.fromstring()通话中遇到错误,但通常不会发生。我无法弄清楚我经常看到该错误,但是我认为每千次甚至上万次,我都会遇到该错误。当错误发生并且脚本停止后立即运行完全相同的脚本时,我看不到错误,并且脚本运行正常。为什么会吐出偶尔的错误?有什么办法可以解决这个问题?实例化urllib2.urlopen()函数时,我也遇到类似的问题,但是由于urllib2最近没有看到该错误,因此我现在无法编写确切的错误消息。



温温酱
浏览 292回答 2
2回答

阿晨1998

网站是用(通常是无效的)HTML而不是XML编写的。您不应该将HTML视为XML。使用lxml的HTML解析器,您的问题应该消失了:import urllib2from lxml import etreeparser = etree.HTMLParser()tree = etree.parse(urllib2.urlopen(url), parser)如果您发现在尝试读取无效的HTML时lxml仍然阻塞,那么您将不得不找到一个更宽松的解析器。html5libBeautifulSoup的使用是Python中最宽松(也是最慢)的HTML解析器:from bs4 import BeautifulSoupsoup = BeautifulSoup(urllib2.urlopen(url), 'html5lib')

繁花不似锦

我还遇到一个问题,即lxmliterparse()有时会AttValue: ' expected以非常不可预测的模式抛出。我知道我要发送的XML是有效的,并且重新运行相同的脚本通常会使它工作(或者在完全不同的地方失败)。最后,我设法创建了一个可以重新运行的测试用例,它会立即完成或AttValue在看似随机的结果中引发错误。这是我做错的事情:我输入的iterparse()是我自己编写的类似文件的对象(我正在处理来自请求的HTTP响应流,但必须先将其解压缩)。编写read()方法时,我作弊并忽略了size参数。相反,我只是解压缩一块固定大小的压缩字节,然后返回解压缩后的字节序列,通常比32k lxml请求要多得多!我怀疑这会导致lxml内部某个地方的缓冲区溢出,从而导致上述问题。一旦我停止返回比lxml请求的字节更多的字节,这些随机错误就会消失。
随时随地看视频慕课网APP

相关分类

Python
我要回答