选择所有<a>标签中'class'属性等于指定字符串的href属性的XPath查询

28
我不知道为什么以下查询语句无法运行:
//a/@href[@class='specified_string']

3
由于 class 属性可以包含多个由空格分隔的类名,因此您可能实际上想要使用以下 XPath 表达式://a[contains(concat(' ',normalize-space(@class),' '), 'some_class_name')]/@href - singpolyma
1
@singpolyma:说得好。只是一个小问题:它是' some_class_name '(周围有空格),不是'some_class_name' - kmkaplan
4个回答

56

尝试另一种方式:

//a[@class='specified_string']/@href

毕竟,class<a>元素的属性,而不是href属性的属性。


是的,我认为它可以工作,但问题在于查询返回属性,而我想检索属性的值。我正在用Java编写它,它返回长度为2的NodeList。当我尝试打印它时,它只打印两个xml头: <?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?> 有两个链接与查询匹配,所以似乎是有效的。但我想获取这些href的值。如何做到这一点? - l245c4l
1
NodeList 应该包含代表 href 属性的 Node 列表。因此,只需在这些节点上运行 getNodeValue() 就可以获得 href 属性的值。 - ndim
虽然我认为它完全正确,但在我的情况下它不起作用。我的Chrome可以使用//a[@name="topic"]来提取正确的a元素。但是,//a[@name="topic"]/@href返回一个列表[, , , , , ],好像没有href属性一样。这是一个示例"a元素":<a href="/topic/19778287" name="topic">XXX</a>。 - Skywalker326
只是想让你们知道,那个Xpath 实际上起作用了。但是Chrome控制台却显示一个类似空的列表。当我将该列表分配给一个变量并打印该变量时,我想要的一切都在那里。我会保留我的原始评论,以便其他遇到同样问题的人可以参考。 - Skywalker326

7

属性不能有属性,只有元素可以有属性。

原始的XPath表达式:

//a/@href[@class='specified_string'] 

选择任何 a 元素的任何 href 属性,使其具有一个属性 class,其值为 'specified_string'

你想要的是:

//a[@class='specified_string']/@href 

那就是:任何具有值为“specified_string”的class属性的元素的href属性。

2
你的意思是要查找一个名为 href 的属性,该属性(这就是错误所在)的 class 应该等于 specified_string
但你需要找到一个元素 a 的属性 classspecified_stringhref 属性。
(ndim 的答案与我的重叠了)

1

在锚点标签中没有class属性,只有href。可以使用//*[@href='value']来识别,但是//*a[@href='value']无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接