2012-02-27 32 views
5

tôi có mã này:Làm thế nào để chọn phụ huynh dựa trên trẻ em trong lxml?

<table cellspacing="1" cellpadding="1" border="0"> 
    <tbody> 
    <tr> 
    <td>Something else</td> 
    </tr> 
    <tr> 
    <td valign="top"> 
     <a href="http://exact url">Something</a> 
    </td> 
    <td valign="top">Something else</td> 
    </tr> 
    </tbody> 
</table> 

Tôi muốn tìm bảng nhưng rất khó để nhắm mục tiêu nó (mã rất giống nhau được sử dụng như 10 lần). Nhưng tôi biết những gì có trong URL. Làm thế nào tôi có thể nhận được sau đó bảng cha?

Trả lời

4

Nếu tetree cho đoạn này của XML, sau đó liên kết mà bạn đang tìm kiếm là

t.xpath('//a[@href = "http://exact url"]')[0] 

Từ đó, bạn có thể đến số table bằng cách sử dụng trục ancestor:

t.xpath('//a[@href = "http://exact url"]/ancestor::table')[-1] 
+0

larsmans: Dòng cuối cùng trong câu trả lời của bạn sẽ nhận được 'bảng' ngoài cùng của tất cả các bảng với hậu duệ phần tử' a' muốn. Tôi nghĩ rằng OP cần bảng trong cùng. –

+0

@DimitreNovatchev: bạn nói đúng, tôi nên lấy phần tử cuối cùng của danh sách. Đã sửa lỗi, cảm ơn! –

+0

larsmans: Wow - index có giá trị -1 ... Ngôn ngữ này là gì? –

0

//a[@href="http://exact url"]/../../..

Bạn sẽ cần 3 .. s để đạt được các yếu tố bảng.

+0

Đó là phần tử 'td'. –

+0

Ha, đã sửa nó khi bạn nhận xét. – beerbajay

+0

Ah. Tuy nhiên, không phải là một giải pháp đặc biệt đẹp hay chung chung. –

2

Lọc bảng bằng cách sử dụng []. Lưu ý rằng các thuộc tính là một đứa cháu //table[.//@href="blah"]

Hoặc //a[@href="blah"]//ancestor::table

2

Một giải pháp XPath thuần túy.

Sử dụng:

(//a[@href = "http://exact url"])[1]/ancestor::table[1] 

này chọn tổ tiên đầu tiên table của phần tử đầu tiên a trong tài liệu XML, chuỗi giá trị của thuộc tính mà href là chuỗi "http://exact url".

Điều này cung cấp chính xác table yếu tố ngay cả trong trường hợp khi có các bảng lồng nhau mỗi phần tử có phần tử mong muốn a làm hậu duệ. Trong trường hợp này, biểu thức XPath ở trên chọn ở trên cùng như vậy table - trái ngược với câu trả lời hiện được chấp nhận, có được tổ tiên ngoài cùngtable.

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