假设我有这样一个例子:

<div>
<p>some text <em>emphasized text</em> some other text</p>
<p><em>The paragraph I want to capture</em></p>
<p>some text <em>emphasized text</em> some other text and <em>other em text</em> until the end.</p>
</div>

我想 Select 的是第二段(但也可能是第三段或第一段).问题是,在这里,pem是相邻的.<p><em>之间没有文本,既没有开头也没有结尾.所有文本都在<em>xyz</em>内.

如何使用XPath Query获取它?

我try 了//p/em,//p/child:em,//em/parent:p,所有这些都 Select 了这三个段落,因为所有的em都是p的子元素. //p[starts-with(.,'./em')]也帮不上忙.

推荐答案

Update

根据 comments ,OP澄清道:

是的,我想要捕获任何只包含强调文本的段落,它是包含在一个或多个em个标签中.

因此,我建议更新XPath,

//p[em][not(node()[not(self::em)])]

将 Select 具有一个或多个em个子元素的所有p个元素,但不 Select 任何类型的其他子元素-只有完全强调的段落.


Old answer

这个XPath,

//p[count(node())=1][em]

将 Select 具有单个子 node 的所有p个元素,即em个元素.

解释

  • //p将 Select 文档中的所有p个元素.
  • [count(node())=1]只筛选出具有单个子元素node()p个元素.由于node()匹配any种类型的 node (包括元素 node 和文本 node ),因此它将确保只 Select 具有任何类型的单个子 node 的p个元素.
  • [em]仅筛选出具有em个子元素的单个子p元素.

因此,对于您的输入XML/HTML,只有目标p

<p><em>The paragraph I want to capture</em></p>

将被选中.如果再有p个子元素,有3个em个子元素,

<p><em>Do</em><em>not</em><em>select</em></p>

或者em个子元素和其他元素的子元素,

<p><em>Do</em><sup>not</sup><sub>select!</sub><span> or else!</span></p>

这样的p个元素将有not个被选中.

Warning:在另一个答案中,//p[not(text())][em],然而,将 Select 这样的p个元素.

See also

Html相关问答推荐

html列表顺序类型类似于子列表

将弹性容器设置为内容宽度

让多对图像在各自的div中叠加

在Firefox中,使用写入模式:Vertical-LR时,不随内容扩展的css弹性项

滚动平滑在笔记本电脑上不起作用,但在Nextjs网站的手机浏览器中起作用

如何在页面太短时使<;img&>缩小而不发生y溢出

一切停止工作后,添加不透明度(在tailwind )

rmarkdown HTML数字不适用于针织衫_1.44

为什么一个 CSS 网格框比其他网格框低?

目标第一个祖先标签的 XPath

:after 伪元素没有出现,即使它有 content 属性

伪元素:after和溢出隐藏

下划线在 Bootstrap 5 导航链接下无法正常工作

如何调整底部有 SVG 的元素的高度,使其在所有宽度上看起来都不错?

增加第一个字母的大小不再正确居中文本

获取 div 中每个元素的 href 并使用它

在身体外部创建 tanget 45° div

需要禁用聚焦输入的工具提示(jquery)

打开 Bootstrap 模式时无法获得模糊的背景

CSS 网格自动高度不适用于特定网格区域