如何使用XPath通过链接文本找到链接URL?


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,如果我给它news,它会给http://cnn.com

Answers:


141

应该类似于:

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

73
我会学习xpath吗?当我看到一个查询时,它是如此明显且易于理解...但是我却永远无法自己编写一个查询
flybywire 2009年

4
@flybywire如果您阅读了Stanford的免费数据库入门课程,则其中有关于XML和XPath的精彩部分。
James P.

4
代替text(),您可以使用“。=”,例如//a[.='Register here']
danpop

1
如果我不知道文字怎么办?我可以选择包含http或特定关键字的节点吗?
Alston

77

对您来说太迟了,但对于其他有相同问题的人来说...

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

当然,“编程”可以是任何文本片段。


1
这个更笼统。好份额
Aaron Gillion 2015年

这是区分大小写的。我可以忽略这里的情况吗?
user3060430

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

它基本上标识<a>具有所需文本的锚点节点,并提取href属性。


6

将方括号中的短语视为SQL中的WHERE子句。

因此,该查询说,“选择出现在任何位置(//)的“ a”标签的“ href”属性(@),但仅在“(a)标签的文本内容等于”的位置(方括号中的短语)编程问题网站”。


嗨,彼得,您有任何教程站点可以学习xpath查询吗?
Karim Narsindani 2015年

4

对于不区分大小写的包含,请使用以下命令:

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

转换将PROGRAMMING中的大写字母转换为小写程序。


请不要添加“谢谢”作为答案。在网站上花费一些时间,您将获得足够的特权来投票赞成您喜欢的答案,这是Stack Overflow表示感谢的方式。
Sklivvz 2013年

5
“谢谢”不是我的“答案”。从某种意义上说,我认为自己得到了我改进的答案。
阿卜杜

1

如果您使用的是HTML敏捷包,请使用getattributeValue:

$doc2.DocumentNode.SelectNodes("//div[@class='className']/div[@class='InternalClass']/a[@class='InternalClass']").GetAttributeValue("href","")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.