我可以用lxml只下载网页的一部分吗?

1 投票
2 回答
853 浏览
提问于 2025-04-17 04:26

我不太确定这样做是否可行,而且lxml的文档对我来说不是很友好。

比如说,我能不能用类似这样的代码:

import lxml.html as lx
x = lx.parse('http://web.info/page.html')
y = x.xpath('\\something\interesting'[2])

或者其他类似的方式,这样我就不用下载整个网页了?

如果lxml不行,那有没有其他的Python模块可以做到这个?

2 个回答

3

你可以试试增量解析

import urllib2
import lxml.html as LH

# request a partial download
url='http://www.python.org/'
req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (0, 1024)
f = urllib2.urlopen(req)
content=f.read()
# print(content)

# incremental parsing
parser=LH.HTMLParser()
parser.feed(content)
x = parser.close()
y = x.xpath('//link')
print(y)

会产生

[<Element link at 9dc5aac>, <Element link at 9dc5adc>, <Element link at 9dc5b0c>]
1

不行:lxml 必须先解析整个页面,才能确保找到其中的某个部分。为了解析整个页面,它显然需要先下载整个页面。(不过,可以看看unutbu的回答,里面有可能的部分下载/解析方法。)

虽然我相信可以通过HTTP请求获取文件的一部分(我想是通过range头部?),但这并不一定在服务器端得到支持。

真可惜,HTTP没有提供一种方法,可以在请求页面时同时发送一个XPath查询给服务器,然后把查询结果返回。

撰写回答