我有一个 XHTML 文档,我想选择其中唯一一个带有 class="index" 的表。
如果我理解正确,后代轴将选择从当前节点直接和间接下降的所有节点,所以这就是我所得到的。
//descendant::table[@class="index"]
使用 xmlstarlet 进行测试时,它似乎不起作用。是我的工具坏了,还是 XPath 表达式错误?
我有一个 XHTML 文档,我想选择其中唯一一个带有 class="index" 的表。
如果我理解正确,后代轴将选择从当前节点直接和间接下降的所有节点,所以这就是我所得到的。
//descendant::table[@class="index"]
使用 xmlstarlet 进行测试时,它似乎不起作用。是我的工具坏了,还是 XPath 表达式错误?
我想//table[@class="index"]
这就是你想要的
根据您的示例页面(metacritic.com/film/highscores.shtml),我会说您需要使用:
//TABLE[@CLASS="index"]
(or /descendant::TABLE[@CLASS="index"])
这是因为带有 CLASS 索引的 TABLE 在您的示例页面上以大写形式写入(XML 和 XPath 区分大小写)。
如果您针对特定页面,这将起作用,但如果不同页面对相同的 html 标签使用不同的大小写,则可能会成为问题。
然后你需要一个可憎的东西
//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...]
|//table[@CLASS="index" or @class="index" or ...]
|...
因此,您可能需要在提取信息之前继续使用 Tidy,或者切换到专门用于 HTML 抓取的工具(而不是 XPath)
是的,descendant
轴选择从上下文节点下降的所有节点。但这里的关键是上下文节点。
例如,descendant::span
将检索span
当前节点的所有后代。同样,descendant::*
将检索当前节点的所有后代元素。
如果您需要匹配表和子表,您提供的 XPath 在我的测试期间可以正常工作:
//descendant::table[@class="index"]
...选择表本身和子节点。
如果只需要匹配表的孩子,首先匹配你想要的节点,然后匹配它的后代:
//table[@class="index"]/descendant::*
.. 仅选择表的子节点。
使用此代码
let $info :=($p//descendant::TABLE[@class="index"])
return $info