【问题标题】:How to decode HTML into string?如何将 HTML 解码为字符串?
【发布时间】:2019-07-02 17:32:49
【问题描述】:

我需要将 HTML 解码为纯文本。我知道有很多这样的问题,但我注意到这些解决方案存在一个问题,不知道如何解决。

例如,我们有这段 HTML: <h1><strong>Some text</strong></h1><p><br></p><p>Some more text</p>

尝试过正则表达式解决方案,HttpUtility.HtmlDecode 方法。他们都给出了这个输出:Some textSome more text。单词在应该分开的地方连接起来。有没有办法在不合并单词的情况下解码字符串?

【问题讨论】:

  • 你可以取一个子字符串来取“>”之后的所有字符串和“
  • 你想用什么来分隔这两个短语?什么决定一个短语何时结束,下一个短语何时开始?
  • html-agility-pack.net 将允许您非常成功地解析 HTML 并访问 HTML 的所有部分(包括标签和内部文本)。
  • 单词之间的空格对我有用。只是想确保单词不会混淆。
  • RegEx 不是一个好的答案。当然,您可能会发现它可以在 99% 的时间内工作,但 HTML 不是 XML。对于正则表达式来说太不规则了。

标签: c# html string


【解决方案1】:

目前尚不清楚您希望在最初未分隔的事物之间使用什么分隔符。所以我使用了 NewLine \n
Where(x=>!string.IsNullOrWhiteSpace(x) 将删除空元素,这将导致在更复杂的 html 文档中出现大量 \n\n

var input = "<h1><strong>Some text</strong></h1><p><br></p><p>Some more text</p>";
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);

var result = string.Join(
                "\n", 
                htmlDocument
                    .DocumentNode
                    .ChildNodes
                    .Select(x=> x.InnerText)
                    .Where(x=>!string.IsNullOrWhiteSpace(x))
              );

结果:

“一些文字\n更多文字”

【讨论】:

    【解决方案2】:

    你可以使用如下的东西。在这个示例中,我使用换行符来分隔内部文本,希望您可以调整它以适应您的场景。

    public static string GetPlainTextFromHTML(string inputText)
        {
            // Extracted plain text
            var plainText = string.Empty;
    
            if(string.IsNullOrWhiteSpace(inputText))
            {
                return plainText;
            }
    
            var htmlNote = new HtmlDocument();
            htmlNote.LoadHtml(inputText);
    
            var nodes = htmlNote.DocumentNode.ChildNodes;
            if(nodes == null)
            {
                return plainText;
            }
    
            StringBuilder innerString = new StringBuilder();
    
            // Replace <p> with new lines
            foreach (HtmlNode node in nodes) 
            {
                innerString.Append(node.InnerText);
                innerString.Append("\\n");
            }
    
            plainText = innerString.ToString();
            return plainText;
        }
    

    【讨论】:

      【解决方案3】:

      简单的方法是使用 HTML Agility 包:

      HtmlDocument htmlDocument= new HtmlDocument();
      htmlDocument.Load(htmlString);
      string res=htmlDocument.DocumentNode.SelectSingleNode("YOUR XPATH TO THE INTRESTING ELEMENT").InnerText
      

      【讨论】:

      • 这给出了相同的结果Some textSome more text,而预期结果是Some text Some more text
      • @Sparrow 所以你应该 1. 选择包含它们的 html 元素。或 2. 选择其中的每一个并连接字符串。但这不是优雅的方式。
      【解决方案4】:

      您可以使用正则表达式:]{0,}>

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2017-11-23
      • 2014-02-06
      • 1970-01-01
      • 2016-06-12
      • 2011-10-09
      • 2023-03-07
      相关资源
      最近更新 更多