2012-03-10 29 views
8

Hy vọng một người nào đó có thể nhanh chóng chỉ cho tôi đúng hướng với các khó khăn XPath của tôi.XPath để định vị ô có phân tích cú pháp văn bản HTML bảng

Hiện tại tôi đã đến mức tôi xác định đúng bảng tôi cần trong nguồn HTML nhưng sau đó tôi chỉ cần xử lý các hàng có văn bản 'Chương' ở đâu đó trong DOM.

nỗ lực cuối cùng của tôi là để làm điều này:

// get the correct table 
HtmlTable table = page.getFirstByXPath("//table[2]"); 

// now the failing bit.... 
def rows = table.getByXPath("*/td[contains(text(),'Chapter')]") 

Tôi nghĩ xpath trên sẽ đại diện, làm cho tôi tất cả các yếu tố đó có một phần tử con sau 'td' rằng ở đâu đó trong dom nó chứa văn bản ' Chương'

một ví dụ về một dòng tương ứng từ nguồn của tôi là:

<tr valign="top"> 
    <td nowrap="" align="Right"> 
    <font face="Verdana"> 
    <a href="index.cfm?a=1">Chapter 1</a> 
    </font> 
    </td> 
    <td class="ChapterT"> 
    <font face="Verdana">DEFINITIONS</font> 
    </td> 
    <td>&nbsp;</td> 
</tr> 

Bất kỳ sự giúp đỡ/con trỏ đánh giá rất cao.

Xin cảm ơn,

Trả lời

12

Sử dụng XPath này:

//td[contains(., 'Chapter')] 
+0

Cảm ơn, rằng dường như hoạt động. '.' đại diện? Ngoài ra, tôi không hiểu tại sao tính năng phát hiện 'tái phát' không hoạt động, ví dụ: bạn có // mà như tôi hiểu có nghĩa là bắt đầu từ gốc? – Dave

+0

@Dave, bạn được chào đón. '.' và' // 'là cú pháp viết tắt của XPath. '.' chọn nút ngữ cảnh. '// td' chọn tất cả các con cháu' td' của gốc tài liệu và do đó chọn tất cả các phần tử 'td' trong cùng một tài liệu như nút bối cảnh. * Tham khảo *: http://www.w3.org/TR/xpath/#path-abbrev –

2

Bạn trên đúng "đường dẫn".
Hàm contains() bị giới hạn một phần tử cụ thể, không phải là văn bản trong bất kỳ phần tử con nào. Hãy thử XPath này, mà bạn có thể đọc như sau: - nhận được tất cả tr/td với bất kỳ yếu tố phụ có chứa các văn bản 'Chương'

tr/td[contains(*,"Chapter")] 

Chúc may mắn

+0

Hi William, cho nó một đi nhưng anh ta lại nó để trả lại bất cứ điều gì. Những gì đã làm việc, mặc dù không có vẻ hiệu quả nhất là một lớp lót duy nhất của ' def chapterAnchors = page.anchors.findAll {HtmlAnchor a -> a.asText(). Contains (' Chapter ')}' – Dave

7

bạn muốn tất cả td s dưới nút hiện tại của bạn - không-tất cả trong tài liệulà câu trả lời chấp nhận hiện nay se lects.

Sử dụng:

.//td[.//text()[contains(., 'Chapter')]] 

này sẽ chọn tất cả td hậu duệ của nút hiện tại mà được đặt tên td rằng có ít nhất một hậu duệ nút văn bản, có giá trị chuỗi chứa chuỗi "Chapter".

Nếu nó được biết trước rằng bất kỳ td dưới table này chỉ có một nút văn bản duy nhất, điều này có thể được đơn giản hóa để chỉ:

.//td[contains(., 'Chapter')] 
Các vấn đề liên quan