【问题标题】:How can I extract just text from the html如何从 html 中仅提取文本
【发布时间】:2011-08-16 09:37:49
【问题描述】:

我需要提取 html 的 <body> 中存在的所有文本。示例 Html 输入:-

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

输出应该是:-

This is a big title. How are doing you? I am fine

我只想为此目的使用 HtmlAgility。请不要使用正则表达式。

我知道如何加载 HtmlDocument,然后使用像 '//body' 这样的 xquery 我们可以获得正文内容。但是如何剥离我在输出中显示的 html?

提前致谢:)

【问题讨论】:

  • 请参阅this question 以获取一些 HTML Agility Pack 链接。我猜你必须在HtmlNode 上调用类似InnerText 的属性。

标签: c# html-agility-pack


【解决方案1】:

您可以使用支持从 HTML 提取文本的NUglify

var result = Uglify.HtmlToText("<div>  <p>This is <em>   a text    </em></p>   </div>");
Console.WriteLine(result.Code);   // prints: This is a text

由于它使用 HTML5 自定义解析器,它应该非常健壮(特别是如果文档不包含任何错误)并且速度非常快(不涉及正则表达式,而是纯递归下降解析器,比 HtmlAgilityPack 更快等等GC 友好)

【讨论】:

  • 它似乎在后台使用HtmlAgilityPack,正如接受的答案所建议的那样。
  • @XavierPoinas 不,NUglify 没有使用HtmlAgilityPack,它有自己的 HTML5 自定义解析器。
  • 对不起,你是对的。我在项目中看到了它,但它只是为了进行基准测试。
【解决方案2】:

使用 XPath 表达式 '//body//text()' 选择所有文本节点怎么样?

【讨论】:

    【解决方案3】:

    可以使用正文的InnerText

    string html = @"
    <html>
        <title>title</title>
        <body>
               <h1> This is a big title.</h1>
               How are doing you?
               <h3> I am fine </h3>
               <img src=""abc.jpg""/>
        </body>
    </html>";
    
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;
    

    接下来,您可能想要折叠空格和换行:

    text = Regex.Replace(text, @"\s+", " ").Trim();
    

    但是请注意,虽然它在这种情况下工作,但 hello&lt;br&gt;worldhello&lt;i&gt;world&lt;/i&gt; 等标记将由 InnerText 转换为 helloworld - 删除标签。这个问题很难解决,因为显示通常由 CSS 决定,而不仅仅是由标记决定。

    【讨论】:

    • 注意 xpath 的 htat "/html/body" 要快得多。
    • 报错。找不到 HtmlDocument 的命名空间。
    • @Er.ShaileshS.Bankar - 你有Html Agility Pack 库吗?
    • 不,我必须先添加它吗?
    【解决方案4】:

    通常用于解析 html 我会推荐一个 HTML 解析器,但是由于您想删除所有 html 标记,一个简单的正则表达式应该可以工作。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 2016-02-07
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多