【问题标题】:xpath: skip child node with an given idxpath:跳过具有给定 id 的子节点
【发布时间】:2013-10-03 17:34:14
【问题描述】:

我必须配置我们的企业搜索引擎,并且文档的索引是通过 xpath 选择器完成的。 在当前设置中有一个 xpath

.//div[@id='content']

它基本上选择了网站主要部分的所有元素。同时还有一个额外的 div,其中包含很多废话,所以我尝试修改这个 xpath 以跳过这个 div-tag。我正在努力处理有关“不”的文档,但到目前为止还没有运气。

<div id="content">
  <div id="i-want-this">
   ...
  </div>
  <div id="i-do-not-want-this">
   <span>foo</span>
  </div>
  <div id="i-want-this-too">
   ...
  </div>
</div>

虽然到目前为止我看到 cmets 中的提示对我有所帮助,但我仍然对要跳过的 div-tag 中的子元素有疑问。比方说,里面有一个跨度标签。如果我选择

//div[@id='content']/*[not(@id='i-do-not-want-this')] 我的结果仍然包括这个跨度内容。所以我想,我需要查询 id="content" 以下没有父 id="i-do-not-want-this" 的所有元素。对吧?

【问题讨论】:

  • 你只想要奇数?
  • 不。我的用例是一个 div 标记,其中包含几个在页面本身上非常有用的文本,但如果这些文本显示在我们的企业搜索的 serps 中则完全无用

标签: xpath


【解决方案1】:

使用以下查询。它将选择所有id不是i-do-not-want-this的子元素。

//div[@id='content']/*[@id != 'i-do-not-want-this']

或者——同样的逻辑——使用ǹot()函数(感谢@paul_t)

//div[@id='content']/*[not(@id='i-do-not-want-this')]

更新

当我说相同的逻辑时,这并不正确。请访问@IanRoberts 的评论

【讨论】:

  • //div[@id='content']/*[not(@id='i-do-not-want-this')]
  • @pault。是的,我想记住ǹot() 更便携。但我目前不确定.. 已在我的答案中添加了替代方案。谢谢!
  • x != ynot(x = y) 在这种情况下会做同样的事情,但如果 xy(或两者)是包含多个节点的节点集,它们会有所不同节点。在这种情况下,x != y 为真,如果有任何一对来自x 和一个来自y 的节点不匹配(可能还有其他对匹配),而not(x = y) 仅当 没有对匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多