我需要将HTML解码为纯文本。我知道有很多这样的问题,但我注意到这些解决方案有一个问题,不知道如何解决它。
例如,我们有这段 HTML: <h1><strong>Some text</strong></h1><p><br></p><p>Some more text</p>
尝试了正则表达式解决方案,HttpUtility.HtmlDecode方法。他们都给出了这个输出:Some textSome more text
.单词在它们应该分开的地方连接起来。有没有办法在不合并单词的情况下解码字符串?
目前尚不清楚您在最初未分离的事物之间使用什么分隔符。所以我用了换行n
.
Where(x=>!string.IsNullOrWhiteSpace(x)
将删除空元素,这将导致更复杂的 html 文档中出现大量nn
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))
);
结果:
"一些文本还有一些文本">
简单的方法是使用HTML Agility包:
HtmlDocument htmlDocument= new HtmlDocument();
htmlDocument.Load(htmlString);
string res=htmlDocument.DocumentNode.SelectSingleNode("YOUR XPATH TO THE INTRESTING ELEMENT").InnerText
你可以按如下方式使用一些东西。在此示例中,我使用新行来分隔内部文本,希望您可以对其进行调整以适合您的方案。
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;
}
您可以使用正则表达式:<(div|/div|br|p|/p([^>]{0,}>