2009-08-14 33 views
32

Tôi khá mới đối với XPath, không quan tâm đến nó trong vài giờ, vì vậy tôi không chắc chắn liệu bạn có thể làm điều gì đó như sau với nó không.XPath - Chọn phần tử đầu tiên sau một số thành phần khác

OK, đây là kịch bản: Tôi muốn tìm một liên kết từ một trang. Liên kết đó chỉ có thể nhận ra bởi giá trị văn bản của nó, tức là. văn bản giữa các thẻ <a> (< a href = "#" > liên kết này <a>). Cho đến nay tôi đã cố gắng để có được bàn tay của tôi trên để liên kết các yếu tố với văn bản đó, vấn đề duy nhất là có một vài trong số những người nằm xung quanh.

Các liên kết này được tìm thấy từ danh sách có thứ tự đó đều bắt đầu bằng một thẻ liên kết, mà sẽ đóng vai trò như một thực sự tốt "neo" điểm để bắt đầu việc tìm kiếm các yếu tố cuối cùng mà tôi muốn tìm (ví dụ. Sau đó tôi chỉ có thể chấp nhận là người đầu tiên phù hợp)

để làm rõ mọi thứ một chút, đây là một ví dụ về những gì đang xảy ra:

<a href="#">first dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a> 
<ul> 
    <li><a href="#">some link</a></li> 
    <li><a href="#">link i want to find</a></li> 
</ul> 

Và tôi có lẽ nên chỉ định, mà tôi chỉ muốn r đánh lừa một trong hai kết quả hoặc một tập hợp các kết quả với phần tử đầu tiên là phần tử "đúng" - phần tử tôi muốn tìm.

EDIT: Câu hỏi đã được trả lời đã có, nhưng đã có một số ý kiến ​​mà tôi nên xác định điều này một chút hơn, để mọi người có thể thực sự hiểu câu hỏi;)

Vì vậy, ý tưởng là sử dụng một phần tử để chỉ định vị trí của một phần tử khác có thể có các kết quả tìm kiếm trùng lặp nằm rải rác xung quanh tài liệu.

Về cơ bản bạn sẽ chạy vào một thứ như thế này nếu bạn muốn tìm một liên kết cụ thể từ một nhóm các menu thả xuống có các phần tử có cùng tên hoặc giá trị.

Về cơ bản là nó. Tôi biết rằng nó vẫn còn một chút khó khăn để có được điểm, nhưng tiếc là tôi đang có một thời gian khó cố gắng để giải thích nó tốt hơn. Tôi chắc chắn rằng ai đó khác có thể làm một công việc tốt hơn và nếu điều đó xảy ra, tôi hạnh phúc hơn khi đưa mô tả đó vào đây.

+0

Vui lòng cập nhật các câu hỏi - từ những câu trả lời, bạn có thể thấy rằng mục tiêu của bạn là không rõ ràng – Gishu

Trả lời

51

Tôi phải đọc qua câu hỏi của bạn một vài lần nhưng tôi nghĩ tôi hiểu nó. Những gì bạn quan tâm là các biến vị ngữ. Predicates cho phép bạn chọn các nút dựa trên các điều kiện.

Ví dụ, bạn có thể làm:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find'] 

này sẽ chọn bất kỳ neo với văn bản nhất định trong, tìm ul tiếp theo, sau đó tiến hành thông qua các con của nó.

Ngoài ra, bạn có thể xác định chỉ số vị trí trong một tập kết quả, XPath Sau đây là một cuộc biểu tình (nhưng nó sẽ không giải quyết vấn đề của bạn):

//a[text()='first dropdown menu']/ul/li[last()]/a/text() 

hoặc bạn có thể sử dụng các trục để di chuyển qua anh chị em/tổ tiên/trẻ em:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text() 

Vì vậy, tôi không chắc tôi đã hiểu rõ câu hỏi của bạn nhưng điều này sẽ giúp bạn viết XPath của mình.

Về cơ bản, tôi giả sử XPath của bạn khớp với neo trong nhiều danh sách và bạn muốn đảm bảo rằng bạn chọn đúng danh sách. Tại một số thời điểm trong XPath của bạn, bạn cần một biến vị ngữ để chỉ định một điều kiện sẽ chỉ đúng cho danh sách mà nút mong muốn của bạn đang ở.

+0

Hoạt động đẹp mắt. Cảm ơn ChrisCM! – JHollanti

4

chỉ vì vậy tôi hiểu nó một cách chính xác: bạn muốn "một số liên kết" nút sau khi "trình đơn thả xuống thứ hai"

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find'] 

này nên làm các trick (Tôi không chắc chắn 100% rằng bạn sẽ cần phải kiểm tra vị trí() = 1, nhưng tôi nghĩ rằng nếu bạn bỏ qua nó, nó sẽ khớp với tất cả các ul sau vì tiền tố là "tất cả" tiền tố nút - phụ thuộc vào phần còn lại của cấu trúc xml của bạn)

+0

Thật sự tôi muốn tìm liên kết với "liên kết tôi muốn tìm thấy" giá trị, nhưng điều này sẽ làm chỉ là tốt;) Tôi sẽ kiểm tra nó một chút. – JHollanti

+0

chỉ cần sửa một phần :) – Niko

+0

Tôi chỉ đọc một chút và bạn cần vị trí() = last() thay vì vị trí() = 1 vì tiền tố lấy tất cả các nút 'trước nút ngữ cảnh trong thứ tự tài liệu' – Niko

0

Đúng nếu tôi sai - bạn cần chọn "menu thả xuống thứ hai" từ ví dụ ở trên, nhưng văn bản có thể được sao chép, vì vậy bạn chỉ cần thứ hai. XPath:

//a[text()='second drop down menu'][2] 
+0

Vâng, nhưng ý tưởng là tìm phần tử theo hai tham số riêng biệt. Tham số đầu tiên là thẻ "lập chỉ mục" và thẻ thứ hai là phần tử cụ thể mà tôi muốn tìm. Vì vậy, tham chiếu bởi một vị trí tĩnh là không khả thi. – JHollanti

+0

Điều này sẽ trả lại: second drop down menu hoặc không có gì nếu chỉ có một liên kết phù hợp với nó –

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