2 回答

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')

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