如何使用lxml,XPath和Python从网页中提取链接?
问题描述:
我有了这个XPath查询:如何使用lxml,XPath和Python从网页中提取链接?
/html/body//tbody/tr[*]/td[*]/a[@title]/@href
它提取所有具有title属性的链接 - 并给出FireFox's Xpath checker add-on的href
。
但是,我似乎无法与lxml
一起使用它。
from lxml import etree
parsedPage = etree.HTML(page) # Create parse tree from valid page.
# Xpath query
hyperlinks = parsedPage.xpath("/html/body//tbody/tr[*]/td[*]/a[@title]/@href")
for x in hyperlinks:
print x # Print links in <a> tags, containing the title attribute
这产生从lxml
(空列表)没有结果。
如何在Python下抓取href
包含属性标题的href
文本(链接)lxml
?
答
我能够使其与下面的代码工作:
from lxml import html, etree
from StringIO import StringIO
html_string = '''<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head/>
<body>
<table border="1">
<tbody>
<tr>
<td><a href="http://*.com/foobar" title="Foobar">A link</a></td>
</tr>
<tr>
<td><a href="http://*.com/baz" title="Baz">Another link</a></td>
</tr>
</tbody>
</table>
</body>
</html>'''
tree = etree.parse(StringIO(html_string))
print tree.xpath('/html/body//tbody/tr/td/a[@title]/@href')
>>> ['http://*.com/foobar', 'http://*.com/baz']
答
火狐adds additional html tags当它呈现HTML,使得由萤火虫工具与服务器返回的实际HTML不一致返回的XPath(和什么urllib/2将返回)。
删除<tbody>
标签通常会这样做。
您正在解析的文档是否具有名称空间(xmlns)集? – 2010-01-23 12:56:19