Xpath:如何结合这两个子节点得到父节点?

Posted

技术标签:

【中文标题】Xpath:如何结合这两个子节点得到父节点?【英文标题】:Xpath: How to combine these two child node to get parent node? 【发布时间】:2021-12-31 00:06:53 【问题描述】:

我是 XPath 的新手并且很困惑。任何人都可以快速浏览一下,看看我的语法有什么问题?

我正在尝试选择 id="list-overview" 中的所有直接子 div's,它们的树下某处有两个子节点,其中包含 data-price<=20a div containing "Orange" text

let xy = $x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]][./div/a/div/div[@class='fruit'][contains(.,'Orange')]])`)

打破它。我已经分别测试了这两个并且它们有效。

`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]]`
`//*[@id="list-overview"]/div[./div/a/div/div[@class='fruit'][contains(.,'Orange')])]`

我似乎无法以某种方式将它们结合起来,并且不确定我做错了什么?

编辑:

尝试了建议,以下 xpath 不再抛出异常。但是当有匹配 price 的元素时,它返回空数组

$x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20] and ./div/div/a/div/div[@class='fruit'][contains(.,'Orange')]]`)

【问题讨论】:

用相关的 html 更新问题 @DebanjanB 添加了 pastebin:pastebin.com/r05zN8BR,文件顶部带有 cmets。 我建议使用基于文本的 HTML 更新主要问题 【参考方案1】:

如果我理解您的想法,那么您在这两个条件之间缺少逻辑 and。我相应地更正了 XPath 表达式。请试试这个:

let xy = $x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20] and ./div/a/div/div[@class='fruit'][contains(.,'Orange')]])`)

UPD 请试试这个:

let xy = $x(`//*[@id="list-overview"]/div[.//div[@data-price<=20] and .//div[@class='fruit'][contains(.,'Orange')]])`)

【讨论】:

DOMException:无法在“CommandLineAPI”上执行“$x”:字符串不是有效的 XPath 表达式。这是否意味着找不到xpath或语法不正确? $x(//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price) 耶!没有dom异常了。但它返回一个空数组,而有匹配价格 1) 很好,但您的表达方式似乎正是我所建议的。不? 2) 请查看我的更新建议 @先知是的,你的表达是正确的。我一定在某处留下了括号。 我看到了互联网连接问题。看起来它与***服务器有关。无论如何,请检查更新的答案【参考方案2】:

不是这个

$x(//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]][./div/a/div/div[@class='fruit'][contains(.,'Orange')]]))

您可以这样做以将两者结合起来,

将两个孩子紧紧地结合在一起

$x(//*[@id="list-overview"]/div[./descendant::div[@data-price<=20]] and [./div/a/div/div[@class='fruit'][contains(.,'Orange')]])

或者拥有其中之一,但您仍想继续进行。

$x(//*[@id="list-overview"]/div[./descendant::div[@data-price<=20]] or [./div/a/div/div[@class='fruit'][contains(.,'Orange')]])

另外,我添加了descendant 以使其更具可读性。

【讨论】:

我在你的两个例子中都得到 dom 异常 not valid xpath。我重新测试了分成两部分的 xpath 以仔细检查它们是否有效。也许 xpath 太长了? 添加了一个额外的括号,我已删除并更新了我的答案,请重试。 不幸的是仍然给出 dom 异常 可以分享HTML代码吗? 是的,我做了一个 pastebin:pastebin.com/r05zN8BR 并将示例值映射到真实值。

以上是关于Xpath:如何结合这两个子节点得到父节点?的主要内容,如果未能解决你的问题,请参考以下文章

XPath:从子节点获取父节点

根据XPath中子节点的double值查找父节点

在selenium2中,如何获取一个父节点下子节点的个数,所有的子节点的内容都有MOON

如果它是使用 XPath 在 Scrapy 中的其他节点的父节点,如何从子节点获取文本

Xpath:从父节点和子节点获取属性

XPath如何定位dom节点