Làm cách nào để tìm URL liên kết bằng văn bản liên kết với XPath?


88

Tôi có một trang XHTML được định hình tốt . Tôi muốn tìm URL đích của một liên kết khi tôi có văn bản được liên kết.

Thí dụ

<a href="http://stackoverflow.com">programming questions site</a>
<a href="http://cnn.com">news</a>

Tôi muốn một biểu thức XPath sao cho nếu được cung cấp programming questions sitethì nó sẽ cho http://stackoverflow.comvà nếu tôi cho thì newsnó sẽ cho http://cnn.com.

Câu trả lời:


141

Phải là một cái gì đó tương tự như:

// a [text () = 'text_i_want_to_find'] / @ href

73
tôi có bao giờ học xpath không? khi tôi nhìn thấy một truy vấn nó là như vậy rõ ràng và dễ hiểu ... nhưng tôi không bao giờ có thể viết một ngày của riêng tôi
các hệ thống kiểm soát bay

4
@flybywire Nếu bạn đọc khóa học Giới thiệu về Cơ sở dữ liệu miễn phí này của Stanford có một phần hay về XML và XPath.
James P. Ngày

4
Thay vì văn bản (), bạn có thể sử dụng, ví dụ //a[.='Register đây '] "=".
danpop

1
Nếu tôi không biết văn bản thì sao? Tôi có thể chọn các nút có chứa httphoặc từ khóa nhất định không?
Alston

77

Quá muộn cho bạn, nhưng cho bất kỳ ai khác có cùng câu hỏi ...

//a[contains(text(), 'programming')]/@href

Tất nhiên, 'lập trình' có thể là bất kỳ đoạn văn bản nào.


1
Điều này là khái quát hơn. Tốt share
Aaron Gillion

Đây là trường hợp nhạy cảm. Tôi có thể bỏ qua trường hợp ở đây không?
user3060430

9
//a[text()='programming quesions site']/@href 

về cơ bản xác định một nút neo <a>có văn bản bạn muốn và trích xuất hrefthuộc tính.


6

Hãy coi cụm từ trong ngoặc vuông như một mệnh đề WHERE trong SQL.

Vì vậy, truy vấn này cho biết, "hãy chọn thuộc tính" href "(@) của thẻ" a "xuất hiện ở bất kỳ đâu (//), nhưng chỉ ở nơi (cụm từ được đặt trong ngoặc đơn) nội dung văn bản của thẻ" a "bằng ' trang web câu hỏi lập trình '".


Xin chào Peter, bạn có trang web hướng dẫn nào để tìm hiểu truy vấn xpath không?
Karim Narsindani

4

Đối với các hàm chứa phân biệt chữ hoa chữ thường, hãy sử dụng như sau:

//a[contains(translate(text(),'PROGRAMMING','programming'), 'programming')]/@href

dịch chuyển đổi các chữ cái in hoa trong LẬP TRÌNH sang lập trình chữ thường.


Vui lòng không thêm "cảm ơn" làm câu trả lời. Đầu tư một chút thời gian vào trang web và bạn sẽ có đủ đặc quyền để tán thành các câu trả lời bạn thích, đó là cách Stack Overflow để nói lời cảm ơn.
Sklivvz

5
"Cảm ơn" không phải là "câu trả lời" của tôi. Theo một cách nào đó, tôi đã ghi nhận một câu trả lời mà tôi đã cải thiện ở trên.
Abdo

1

nếu bạn đang sử dụng gói linh hoạt html, hãy sử dụng getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.