XPath 选择内文

Posted

技术标签:

【中文标题】XPath 选择内文【英文标题】:XPath select innertext 【发布时间】:2011-04-21 20:03:23 【问题描述】:

我有这个 html/XML:

\t\t\t\t\t    \r\n\t\t
<a href="/test.aspx">
  <span class=test>
    <b>blabla</b>
  </span>
</a>
<br/>
this is the text I want
<br/>
<span class="test">
  <b>code: 123</b>
</span>
<br/>
<span class="test"></span>
\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t

在 C#4 中,我使用 HtmlAgilityPack 库选择带有 XPath 的节点并获取 InnerText 属性。这将获得节点内的所有文本。我怎样才能只得到文本“这是我想要的文本”?

/text() 只返回\t\t\t\t\t \r\n\t\t

【问题讨论】:

@Alejandro:OP @peter 在接受答案后改变了问题——值得(OP)投票! 【参考方案1】:
/div/text()

从给出的示例中,此 XPath 将为您获取 div 元素下的所有文本节点,在本例中为 test2。

如果您能详细说明这个问题,我们可能会更好地为您提供帮助。 Div 包含 3 个子元素:一个 span 元素、一个文本节点和一个 b 元素。 span 和 b 各有一个文本节点子节点。使用 XPath,您可以仅选择元素 (/div/*)、仅文本节点 (/div/text()) 或所有节点类型 (/div/node())。

编辑:/text() 只会返回根级别的文本节点。在这种情况下,我希望它返回一个包含 3 个文本节点的节点列表:

\t\t\t\t\t    \r\n\t\t 
this is the text I want
\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t

您可能只选择结果节点列表中的第一个节点吗? 有一些格式正确的问题,例如您的&lt;br&gt; 可能应该是&lt;br/&gt;

【讨论】:

嗨,请看我的编辑。您知道为什么它不返回所有文本吗? 嗨,我使用的是 SelectSingleNode,这就是为什么它只返回 /t/t/t/t/t。我应该使用 SelectNodes ...... doh。谢谢 没有问题,很高兴你查到了它的底部 :) 这个答案与问题有什么关系? 哦!对不起。 @peter:不要改变问题。好的做法是提出一个新问题,否则其他人不会从答案中受益。【参考方案2】:

我怎样才能只得到文本“这是 我想要的文字”?

text()[preceding-sibling::node()[1][self::br]]
      [following-sibling::node()[1][self::br]]

含义:两个br元素之间的文本节点。

【讨论】:

【参考方案3】:

@peter:您不应该编辑您的问题,以免人们看到接受的答案与问题有何关联!!!

新问题的答案:

/br[1]/following-sibling::text()[1]

选择想要的文本节点(引号是我的):

"   
this is the text I want   
"

【讨论】:

什么问题?我不是OP。我建议回答原始(模糊)问题。 OP 用更完整的 HTML 片段更新了他的问题,我更新了我的答案(请参阅编辑:部分)以涵盖新示例。最后,甚至不是 XPath 不正确,而是他选择了单个节点(列表中的第一个节点)而不是 C# 中的整个节点列表

以上是关于XPath 选择内文的主要内容,如果未能解决你的问题,请参考以下文章

XPath 中的 CSS 选择器

包含类、子选择器和相邻兄弟选择器的 CSS 选择器的等效 XPath 是啥?

使用 XPath 选择某个 nodeName

类的 Xpath 选择器

使用 XPath 选择具有具体类的第一个节点

scrapy xpath选择器多级选择错误