如何使用Html Agility Pack和C#删除HTML源中的空格

c# html html-agility-pack

发布之前我尝试了这个线程的解决方案:

C# - 在标记之间删除HTML源代码中的空格?

这是我正在使用的HTML的片段:

<p>This is my text</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>This is next text</p>

我正在使用HTML Agility Pack来清理HTML:

HtmlDocument doc = new HtmlDocument();
doc.Load(htmlLocation);
foreach (var item in doc.DocumentNode.Descendants("p").ToList())
{
    if (item.InnerHtml == "&nbsp;")
    {
        item.Remove();
    }
}

上面代码的输出是

<p>This is my text</p>





<p>This is next text</p>

所以我的问题是如何删除HTML源代码中两段之间的额外空格。

热门答案

删除第一个和最后一个段落之间的文本节点:

HTML:

var html = @"
<p>This is my text</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>This is next text</p>";

解析它:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var paragraphs = doc.DocumentNode.Descendants("p").ToList();
foreach (var item in paragraphs)
{
    if (item.InnerHtml == "&nbsp;") item.Remove();
}
var followingText = paragraphs[0]
    .SelectNodes(".//following-sibling::text()")
    .ToList();
foreach (var text in followingText) 
{
    text.Remove();
}

结果:

<p>This is my text</p><p>This is next text</p>

如果要保持段落之间的换行符,请使用for循环并在 最后一个文本节点之外的所有段上调用Remove()

for (int i = 0; i < followingText.Count - 1; ++i)
{
    followingText[i].Remove();
}

结果:

<p>This is my text</p>
<p>This is next text</p>


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因