我之前在某地读过,但我现在无法解释这个问题,所以如果有人能指出我正确的方向,我将不胜感激。
我正在为HTML文档创建规范XPath的XPath选择器。下面是一个简单的例子(包含在HTMLUnit中,它在后台使用xalan,但可以是任何XPath处理器)。
如果我跑:
WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[*]/text()"));
我收到[]回复。但是,如果我改为运行(注意a [*] vs a [/ *]:
WebClient webClient = ......;
HtmlPage page = webClient.getPage("http://www.slideshare.com/");
System.out.println(page.getByXPath("/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a[/*]/text()"));
我将[开发者部分]作为回应。
可以在位置谓词中添加通配符作为参数(即[*])。但是,对于某些节点/标签(我特别注意到文本节点为h1,h2 ......,p,b,强,并且其他一些html标签为li或ul)有时在通配符之前需要斜杠(即[/ *])获得结果。
有人可以提供这是什么意思的背景吗?我无法在网络或XPath规范中找到对此的引用。
答案 0 :(得分:1)
如果您使用“通配符”的意图只是选择路径a
下发生的任何/html/body/footer/div/div/div[2]/div[4]/ul/li[2]
,那么您根本不需要谓词。你可以这样做:
/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a
这将选择所有 a
元素,这些元素是路径/html/body/footer/div/div/div[2]/div[4]/ul/li[2]
的子元素。
答案 1 :(得分:0)
据我所知,a[*]
正在选择a
带有子节点元素(请参阅注释 - 谢谢),因此没有子元素(因为没有子元素)同样适用于h1
,h2
...,p
,b
)。
相比之下,a[/*]
正在选择根目录下的任何a
(更准确地说,在任何有根的文档中 - 再次,请参阅注释)。这适用于所有节点,但完全没有意义。
我认为你应该使用/html/body/footer/div/div/div[2]/div[4]/ul/li[2]/a/text()
[update:]路径可以“模糊”,匹配多个东西,并返回一组结果。你不需要做任何特殊的事情(比如使用[*]
)来做这件事。 [...]
所做的就是添加其他约束。它使更多具体。你不需要任何东西来使事情变得不那么具体 - 默认是尽可能一般。