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<=20
和 a 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:如何结合这两个子节点得到父节点?的主要内容,如果未能解决你的问题,请参考以下文章
在selenium2中,如何获取一个父节点下子节点的个数,所有的子节点的内容都有MOON