ฉันจะค้นหา URL ของลิงก์ด้วยข้อความลิงก์ด้วย XPath ได้อย่างไร


88

ฉันมีหน้าXHTML ที่มีรูปแบบดี ฉันต้องการค้นหา URL ปลายทางของลิงก์เมื่อฉันมีข้อความที่เชื่อมโยง

ตัวอย่าง

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

ฉันต้องการXPathการแสดงออกดังกล่าวว่าหากได้รับprogramming questions siteก็จะให้http://stackoverflow.comและถ้าฉันให้มันก็จะให้newshttp://cnn.com

คำตอบ:


143

ควรเป็นสิ่งที่คล้ายกับ:

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

75
ฉันจะเรียน xpath หรือไม่ เมื่อฉันเห็นข้อความค้นหามันชัดเจนและเข้าใจง่ายมาก ... แต่ฉันไม่สามารถเขียนได้ด้วยตัวเอง
flybywire

4
@flybywire หากคุณอ่านหลักสูตร Introduction to Databases ฟรีของ Stanford นี้มีส่วนที่ดีเกี่ยวกับ XML และ XPath
James P.

4
แทนข้อความ () คุณสามารถใช้ ". =" เช่น //a[.='Register here ']
danpop

1
จะเกิดอะไรขึ้นถ้าฉันไม่ทราบข้อความ ฉันสามารถเลือกโหนดที่มีhttpหรือคำหลักบางคำได้หรือไม่?
Alston

78

สายเกินไปสำหรับคุณ แต่สำหรับใครก็ตามที่มีคำถามเดียวกัน ...

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

แน่นอนว่า 'การเขียนโปรแกรม' อาจเป็นส่วนข้อความใดก็ได้


1
อันนี้เป็นข้อมูลทั่วไปมากขึ้น แบ่งปันดีๆ
Aaron Gillion

นี่เป็นกรณีที่ละเอียดอ่อน ฉันสามารถเพิกเฉยต่อกรณีนี้ได้หรือไม่?
user3060430

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

ซึ่งโดยทั่วไปจะระบุโหนดจุดยึด<a>ที่มีข้อความที่คุณต้องการและแยกhrefแอตทริบิวต์


6

คิดว่าวลีในวงเล็บเหลี่ยมเป็น WHERE clause ใน SQL

ดังนั้นข้อความค้นหานี้จึงบอกว่า "เลือกแอตทริบิวต์" href "(@) ของแท็ก" a "ที่ปรากฏที่ใดก็ได้ (//) แต่เฉพาะที่ (วลีที่มีวงเล็บ) เนื้อหาที่เป็นข้อความของแท็ก" a "เท่ากับ" ไซต์คำถามการเขียนโปรแกรม ""


สวัสดีปีเตอร์คุณมีไซต์การสอนเพื่อเรียนรู้แบบสอบถาม xpath หรือไม่?
Karim Narsindani

4

สำหรับกรณีที่ไม่คำนึงถึงตัวพิมพ์เล็กให้ใช้สิ่งต่อไปนี้:

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

Translate แปลงตัวพิมพ์ใหญ่ในการเขียนโปรแกรมเป็นการเขียนโปรแกรมตัวพิมพ์เล็ก


โปรดอย่าเพิ่ม "ขอบคุณ" เป็นคำตอบ ลงทุนเวลาในไซต์และคุณจะได้รับสิทธิพิเศษเพียงพอในการโหวตคำตอบที่คุณชอบซึ่งเป็นวิธีการกล่าวขอบคุณ Stack Overflow
Sklivvz

5
"ขอบคุณ" ไม่ใช่ "คำตอบ" ของฉัน ฉันกำลังให้เครดิตกับคำตอบข้างต้นที่ฉันปรับปรุงในทางหนึ่ง
Abdo

1

หากคุณใช้ html agility pack ให้ใช้ getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.