2010-01-18 239 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>標籤通常會這樣做。