如何使用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合法嗎? 是的,了解原因