2012-06-15 23 views
5

tôi mã hóa một số Perl để sử dụng XPath để xác định vị trí một td yếu tố cụ thể trong một table` trông tương tự như saubiểu thức XPath để chứa yếu tố của một node văn bản cho

<table> 
    <tr> 
     <td>...</td> 
     <td><font color="white" face="verdana, Helvetica, Arial" size="2">Showing <b>1</b>-<b>100</b> of <b>200</b> total</font></td> 
     <td>...</td> 
     <td>...</td> 
    </tr> 
    </table> 

Những gì tôi muốn là để tìm một td phần tử có nút font/text() chứa chuỗi Showing.

trận contains(., "Showing")

Một so sánh trực tiếp hoạt động tốt:

//td[font/text()="Showing "] 

nhưng tôi muốn sử dụng chức năng XPath để trận đấu là linh hoạt hơn.

Tôi đã thử

//td[contains(font/text(), "Showing ")] 

nhưng điều này làm tăng lỗi

XPath failed due to: A sequence of more than one item is not allowed as the first argument of contains() 

và tôi đã cố gắng để đạt được những gì tôi muốn với

//td[font/text()[contains(., "Showing")]] 

nhưng điều này là rất xấu xí và tôi đang hy vọng cho một cái gì đó ngắn gọn hơn. Xin vui lòng ai đó có thể cải thiện điều này cho tôi, hoặc có lẽ xác nhận rằng đây là cách tốt nhất và súc tích nhất?

+0

ngắn gọn hơn? Bạn có một xpath nói rằng "Tất cả' td 'có một' font' có văn bản chứa 'Hiển thị'" - đó chính xác là câu lệnh vấn đề của bạn! - và bạn muốn nó ngắn gọn hơn? – AakashM

+0

@AakashM: Đúng vậy. Chỉ vì nó là * một * cách để thể hiện những gì tôi muốn không có nghĩa là nó * sạch nhất *. Tôi không phải viết '//td[font/text()[.="Showing"]] 'vì vậy tôi nghĩ rằng có thể có một cách sử dụng' contains' thay vì '='. – Borodin

+1

Vậy tại sao bạn lại nghĩ rằng cụm từ "rất xấu xí"? Nó là cái tôi sẽ sử dụng - và điều này có nghĩa là ít nhất là với kiến ​​thức của tôi, không có một thứ gì tao nhã hơn. –

Trả lời

7

Hãy thử điều này:

//td[contains(font/text()[1], 'Showing ')] 
+1

Cảm ơn Kirill. Điều đó hoạt động, nhưng chỉ khi đó là nút văn bản đầu tiên khớp với. Tôi muốn tìm một 'td' trong đó bất kỳ' font/text() 'nào chứa chuỗi đã cho. – Borodin

+0

@Borodin Bạn có nghĩa là như thế này: '// td [contains (font/text(), 'Showing')]'? – toniedzwiedz

+0

@Borodin, Theo thông số XPath, nếu đối số không thuộc kiểu 'string', thì nó được chuyển thành chuỗi bằng cách sử dụng hàm' string() 'và sau đó kết quả của chuyển đổi đó được đánh giá. Vì vậy, công cụ XPath của bạn không hoạt động đúng cách. –

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