2010-01-18 32 views
5

Tôi đã có truy vấn xpath này:Làm thế nào để trích xuất các liên kết từ một trang web bằng cách sử dụng lxml, XPath và Python?

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

Nó trích xuất toàn bộ liên kết với thuộc tính tiêu đề - và cung cấp cho các href trong FireFox's Xpath checker add-on.

Tuy nhiên, tôi không thể sử dụng nó với 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 

Điều này không tạo ra kết quả từ lxml (danh sách trống).

Làm cách nào để lấy văn bản href (liên kết) của siêu liên kết chứa tiêu đề thuộc tính với lxml trong Python?

+0

Tài liệu bạn đang phân tích cú pháp có một vùng tên (xmlns) được đặt không? –

Trả lời

9

tôi đã có thể làm cho nó làm việc với đoạn mã sau:

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

Firefox adds additional html tags để html khi nó ám, làm cho xpath trả về bởi các công cụ firebug không phù hợp với html thực tế được trả về bởi máy chủ (và những gì urllib/2 sẽ trở lại).

Xóa thẻ <tbody> thường thực hiện thủ thuật.

Các vấn đề liên quan