我可以用lxml只下载网页的一部分吗?
我不太确定这样做是否可行,而且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查询给服务器,然后把查询结果返回。