Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么lxml在Python中有时(但不常见)会抛出一个错误?_Python_Web Scraping_Urllib2_Lxml_Elementtree - Fatal编程技术网

为什么lxml在Python中有时(但不常见)会抛出一个错误?

为什么lxml在Python中有时(但不常见)会抛出一个错误?,python,web-scraping,urllib2,lxml,elementtree,Python,Web Scraping,Urllib2,Lxml,Elementtree,我经常使用Python中的lxmlmodule从一些网站抓取数据,通常我对该模块比较熟悉。但是,当我尝试刮取时,有时会遇到lxml.etree.XMLSyntaxError:AttValue:“或etree.fromstring()上的'expected错误调用,但通常不会。我无法说明我看到该错误的频率,但我认为数千次甚至上万次中有一次我遇到了错误。当我在错误发生后立即运行完全相同的脚本,并且脚本停止时,我看不到错误,脚本运行情况也不符合预期。为什么它会抛出oca局部错误?有什么方法可以解决这个

我经常使用Python中的
lxml
module从一些网站抓取数据,通常我对该模块比较熟悉。但是,当我尝试刮取时,有时会遇到
lxml.etree.XMLSyntaxError:AttValue:“或
etree.fromstring()上的'expected
错误
调用,但通常不会。我无法说明我看到该错误的频率,但我认为数千次甚至上万次中有一次我遇到了错误。当我在错误发生后立即运行完全相同的脚本,并且脚本停止时,我看不到错误,脚本运行情况也不符合预期。为什么它会抛出oca局部错误?有什么方法可以解决这个问题吗?我在实例化urllib2.urlopen()函数时遇到了类似的问题,但由于我最近没有看到来自
urllib2
的错误,所以我现在无法写出确切的错误消息

谢谢。

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

使用后,您的问题应消失:

import urllib2
from lxml import etree

parser = etree.HTMLParser()
tree = etree.parse(urllib2.urlopen(url), parser)
如果您在尝试读取无效HTML时发现lxml仍然阻塞,则必须找到一个更宽松的解析器。
html5lib
with BeautifulSoup是Python最宽松(也是最慢)的HTML解析器:

from bs4 import BeautifulSoup

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

我还有一个问题,lxml的
iterparse()
偶尔会抛出一个
AttValue:“预期的
”以一种非常不可预测的模式。我知道我发送的XML是有效的,重新运行相同的脚本通常会使它工作(或者在完全不同的点失败)

最后,我成功地创建了一个可以重新运行的测试用例,它将立即完成或在一个看似随机的结果中引发一个
AttValue
错误

我对
iterparse()
的输入是我自己编写的一个类似文件的对象(我正在处理来自请求的HTTP响应流,但必须先将其解压缩)method,我欺骗并忽略了size参数。相反,我只需解压缩一个固定大小的压缩字节块,然后返回这个解压缩后的字节序列,通常比32k lxml请求多得多!

我怀疑这会导致lxml内部某个地方的缓冲区溢出,从而导致上述问题。一旦我停止返回超过lxml请求的字节数,这些随机错误就会消失。

可能是无效的XML?捕获导致错误的数据,并使用。(对于相同的数据,错误不太可能非确定性地发生-可能是服务器返回了其他内容?)也许,我应该澄清更多,但我通常看不到错误;我只是在尝试刮取完全相同的页面时遇到错误,比如说,1000~10000次中就有一次,每次我尝试刮取时都是完全相同的XML。此外,页面由严格的XML文件组成,而不是在web上经常看到的无效HTML文件。最后,即使我看到错误了吗,下次我尝试刮取相同的页面时,它由完全相同的XML文件组成(文件中的任何内容都没有更改),错误不再发生。。。