我在某些服务器上有一个巨大的HTML文件(数十兆字节),我需要定期下载和解析,检测更改。因此,我尝试使用最常用的工具来执行此任务 - requests和lxml。
我发现流分析的常见配方看起来与此类似:
def fast_iter(url):
resp = requests.get(
url,
stream=True
)
context = etree.iterparse(resp.raw, html=True)
for event, elem in context:
print(elem)
if event == 'end' and elem.tag in TAGS:
yield elem
elem.clear()
while elem.getprevious() is not None:
if elem.getparent():
del elem.getparent()[0]
else:
break
del context
但在我的情况下它只是不起作用,因为 iterparse() 变得疯狂并返回源HTML文件中从不存在的一些元素(和它&# 39;没破!):
<Element vqoe at 0x7eff9762b448>
<Element jzu at 0x7eff9762b408>
<Element vvu at 0x7eff9762b3c8>
<Element d at 0x7eff9762b388>
<Element s at 0x7eff9762b348>
<Element ss_lt at 0x7eff9762b308>
有趣的是,当我只是在本地保存这个文件并从FS解析时 - 一切顺利,但我真的想避免这个无用的步骤。与请求返回的文件类对象有什么不同吗?这种方法有什么问题?
请求== 2.9.1
LXML == 3.5.0