【问题标题】:Get text that lies after pattern without class or id获取位于没有类或 id 的模式之后的文本
【发布时间】:2014-03-20 10:34:00
【问题描述】:

我正在使用HtmlAgiityPack

它是解析数据的绝佳工具,但是我使用它的每个实例,我总是有一个类或 id 来瞄准,即 -

string example = doc.DocumentNode.SelectSingleNode("//div[@class='target']").InnerText.Trim();

但是,我遇到了一段文本,它没有嵌套在任何具有我可以瞄准的类或 id 的特定模式中。例如。 -

<p>Example Header</p>: This is the text I want!<br>

但是,给出的示例始终遵循相同的模式,即文本始终位于 &lt;/p&gt;: 之后和 &lt;br&gt; 之前。

我可以使用正则表达式来提取文本,但我更喜欢使用敏捷包,因为其余代码也将遵循。有没有办法使用包做到这一点?

【问题讨论】:

    标签: c# regex parsing html-agility-pack


    【解决方案1】:

    这个 XPath 对我有用:

    var html = @"<div class=""target"">
    <p>Example Header</p>: This is the text I want!<br>
    </div>";
    var doc = new HtmlDocument();
    
    doc.LoadHtml(html);
    var result = doc.DocumentNode.SelectSingleNode("/div[@class='target']/text()[(normalize-space())]").OuterHtml;
    Console.WriteLine(result);
    
    • /text() 选择所有作为&lt;div&gt; 直接子节点的文本节点
    • [(normalize-space())] 排除所有仅包含白色的文本节点 空格(此 html 示例中排除了 2 个新行:一个在 &lt;p&gt; 之前,另一个在 &lt;br&gt; 之后)

    结果:

    更新一:

    所有元素都必须有一个父元素,如上例中的&lt;div&gt;。或者,如果它是您正在谈论的根节点,那么同样的方法应该仍然有效。关键是使用/text() XPath 获取文本节点:

    var html = @"<p>Example Header</p>: This is the text I want!<br>";
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var result = doc.DocumentNode.SelectSingleNode("/text()[(normalize-space())]").OuterHtml;
    Console.WriteLine(result);
    

    更新二:

    好的,所以你想在&lt;p&gt; 元素之后和&lt;br&gt; 元素之前选择文本节点。然后你可以使用这个 XPath :

    var result = 
            doc.DocumentNode
               .SelectSingleNode("/text()[following-sibling::br and preceding-sibling::p]")
               .OuterHtml;
    

    【讨论】:

    • 也许我不清楚,但是 '/div[@class='target']' 是我何时可以获取文本的示例,第二个示例没有附加 div、类或 id .这就是我的问题。
    • 检查我的更新。所有元素都必须具有条件才能创建查询以选择它。那么这个文本元素的标准是什么,它只是包含文本“This is the text I want!”的文本元素吗?如果是这样,您可以使用这个 XPath:/text()[contains(., 'This is the text I want!')]
    • 好的,我已经阅读了您的更新,但是我想要获取的文本总是在变化,所以 contains 的方法不起作用?标准将是始终在“”之后和“
      ”之前的文本
    • 我明白了。显然你已经说过有问题(抱歉错过了那部分)。检查 更新 II 部分。
    • 就是这个!发现在芽上。
    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多