【问题标题】:Getting the text from a node using HtmlAgilityPack使用 HtmlAgilityPack 从节点获取文本
【发布时间】:2010-11-01 20:57:02
【问题描述】:

我有以下 HTML:

<div class="top">
    <p>Blah.</p>
    I want <em>this</em> text.
</div>

提取字符串“I want &lt;em&gt;this&lt;/em&gt; text.”的 XPath 表示法是什么? 编辑:我不一定想要一个 XPath 表达式来提取字符串。选择多个节点并对其进行迭代以生成句子也会很棒。

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(myHtml);
doc.DocumentNode.SelectSingleNode("??????");

【问题讨论】:

    标签: c# xpath html-agility-pack


    【解决方案1】:
    /div[@class='top']/p[.='Blah.']/following-sibling::node()
    

    /div[@class='top']/node()[not(self::p)]
    

    【讨论】:

    • @Alejandro,他将 XPath 放在 SelectSingleNode() 中,但是没有一个 XPath 表达式可以得到他想要的结果。
    • @Alejandro:这给了我“我想要”,但不是句子的其余部分。 @LarsH:不一定是 SelectSingleNode,我只是在寻找任何方法来获取整个句子(html 仍然完好无损)。
    • 哦,我现在明白了。如果我使用 SelectNodes() [根据 LarsH 的建议],它会给我整个句子。
    • @grautur:是的,你必须使用SelectNodes()(正如@LarsH 指出的,Agility Pack 没有可用的网络文档)。
    【解决方案2】:

    你要提取什么,节点还是字符串?

    如果您需要节点,"I want &lt;em&gt;this&lt;/em&gt; text." 是一个 XML 片段,由 两个文本节点和一个 &lt;em&gt; 元素组成,该元素有一个文本节点子节点。由于它在顶层有多个节点,因此您需要使用SelectNodes("xpath expression a la @Alejandro") 而不是SelectSingleNode() 来提取它们。

    如果你想要一个字符串,你需要再次使用 SelectNodes();然后遍历选定的节点并连接每个节点的outerHTML。请参阅here 了解类似的一个很好的例子。

    此外,从您的示例中还不清楚 XPath 表达式通常会给您想要的东西。例如。你想要&lt;div class="top"&gt; 下最初的&lt;p&gt;...&lt;/p&gt; 之后的所有内容吗?或者你想要&lt;div&gt; 下的所有文本,除了 all &lt;p&gt; 元素?或者也许是别的什么?当然,如果@Alejandro 的 XPath 表达式对您有用,那么它已经足够明确了。

    【讨论】:

    • 我要提取字符串“I want &lt;em&gt;this&lt;/em&gt; text.
    • 如果需要,使用 SelectNodes() 并遍历每个节点。
    • @grautur:好的...请参阅我在最新编辑中链接到的示例。我很难找到 HTML Agility Kit 的文档……你知道它在哪里吗?我下载了一个 chm 帮助文件,但它显然在 Windows 7 中不起作用。
    • 我知道了,谢谢!我用了亚历杭德罗的表情。 [我没有意识到我必须选择多个节点,也不知道存在“OuterHtml”。] 不过,您的解释非常有帮助,所以我会接受您的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多