2010-01-18 184 views
5

我有了这个XPath查询:如何使用lxml,XPath和Python从网页中提取链接?

/html/body//tbody/tr[*]/td[*]/a[@title]/@href 

它提取所有具有title属性的链接 - 并给出FireFox's Xpath checker add-onhref

但是,我似乎无法与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

+0

您正在解析的文档是否具有名称空间(xmlns)集? – 2010-01-23 12:56:19

回答

9

我能够使其与下面的代码工作:

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://stackoverflow.com/foobar" title="Foobar">A link</a></td> 
     </tr> 
     <tr> 
      <td><a href="http://stackoverflow.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://stackoverflow.com/foobar', 'http://stackoverflow.com/baz'] 
2

火狐adds additional html tags当它呈现HTML,使得由萤火虫工具与服务器返回的实际HTML不一致返回的XPath(和什么urllib/2将返回)。

删除<tbody>标签通常会这样做。