2010-04-14 41 views
11

Tôi muốn phân tích cú pháp HTML bằng lxml bằng cách sử dụng các biểu thức XPath. Vấn đề của tôi là phù hợp về nội dung của thẻ:Làm cách nào để khớp nội dung của một phần tử trong XPath (lxml)?

Ví dụ cho các yếu tố

<a href="http://something">Example</a> 

tôi có thể phù hợp với thuộc tính href sử dụng

.//a[@href='http://something'] 

nhưng cho sự biểu hiện

.//a[.='Example'] 

hoặc thậm chí

.//a[contains(.,'Example')] 

lxml ném ngoại lệ 'vị từ nút không hợp lệ'.

Tôi đang làm gì sai?

EDIT:

Ví dụ mã:

from lxml import etree 
from cStringIO import StringIO 

html = '<a href="http://something">Example</a>' 
parser = etree.HTMLParser() 
tree = etree.parse(StringIO(html), parser) 

print tree.find(".//a[text()='Example']").tag 

sản lượng dự kiến ​​là 'a'. Tôi nhận được 'Lỗi Cú pháp: vị nút không hợp lệ'

+2

Thay vì sử dụng StringIO, bạn có thể đã sử dụng etree.fromstring() để phân tích cú pháp html của bạn. –

Trả lời

18

tôi sẽ cố gắng với:

.//a[text()='Example']

sử dụng xpath() phương pháp:

tree.xpath(".//a[text()='Example']")[0].tag 

Nếu trường hợp bạn muốn sử dụng iterfind() , findall(), find(), findtext(), hãy nhớ rằng các tính năng nâng cao như so sánh giá trị và chức năng không có sẵn trong ElementPath.

lxml.etree supports the simple path syntax of the find, findall and findtext methods on ElementTree and Element, as known from the original ElementTree library (ElementPath). As an lxml specific extension, these classes also provide an xpath() method that supports expressions in the complete XPath syntax, as well as custom extension functions.

+0

Tôi không muốn tìm liên kết dựa trên href, nhưng dựa trên văn bản chứa: "Ví dụ" trong ví dụ trên :) .//a[@href='http://something '] hoạt động theo cách của nó ... – akosch

+1

bạn cần phải xóa một = .//a[text()='Example '] – Greg

+0

Cảm ơn đề xuất của bạn, nhưng điều này làm tăng "Cú pháp Cú pháp: vị từ nút không hợp lệ" quá – akosch

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