为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

网站是用(通常是无效的)HTML而不是XML编写的。您不应该将HTML视为XML。


使用lxml的HTML解析器,您的问题应该消失了:


import urllib2

from lxml import etree


parser = etree.HTMLParser()

tree = etree.parse(urllib2.urlopen(url), parser)

如果您发现在尝试读取无效的HTML时lxml仍然阻塞,那么您将不得不找到一个更宽松的解析器。html5libBeautifulSoup的使用是Python中最宽松(也是最慢)的HTML解析器:


from bs4 import BeautifulSoup


soup = BeautifulSoup(urllib2.urlopen(url), 'html5lib')


查看完整回答
反对 回复 2021-03-27
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

我还遇到一个问题,即lxmliterparse()有时会AttValue: ' expected以非常不可预测的模式抛出。我知道我要发送的XML是有效的,并且重新运行相同的脚本通常会使它工作(或者在完全不同的地方失败)。

最后,我设法创建了一个可以重新运行的测试用例,它会立即完成或AttValue在看似随机的结果中引发错误。这是我做错的事情:

我输入的iterparse()是我自己编写的类似文件的对象(我正在处理来自请求的HTTP响应流,但必须先将其解压缩)。编写read()方法时,我作弊并忽略了size参数。相反,我只是解压缩一块固定大小的压缩字节,然后返回解压缩后的字节序列,通常比32k lxml请求要多得多!
我怀疑这会导致lxml内部某个地方的缓冲区溢出,从而导致上述问题。一旦我停止返回比lxml请求的字节更多的字节,这些随机错误就会消失。


查看完整回答
反对 回复 2021-03-27
  • 2 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号