如何使用HTML Agility Pack清理格式錯誤的HTML

asp.net c# html html-agility-pack

我試圖替換這個神可怕的正則表達式集合,這些正則表達式目前用於清理格式不良的HTML塊,並偶然發現了用於C#的HTML Agility Pack。它看起來非常強大,但是,我找不到一個如何使用包的例子,在我看來,它將是包含在其中的所需功能。我確信我是個白痴,在文檔中找不到合適的方法。

讓我解釋一下......說我有以下html:

<p class="someclass">
    <font size="3">
        <font face="Times New Roman">
            this is some text
            <a href="somepage.html">Some link</a>
        </font>
    </font>
</p>

......我想看起來像:

<p>
    this is some text
    <a href="somepage.html">Some link</a>
</p>

當我使用HtmlNode.Remove()方法時,它會刪除節點及其所有子節點。有沒有辦法刪除保留孩子的節點?

謝謝 :)

一般承認的答案

在HtmlNode上,RemoveChild方法有這個重載:

public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);

所以這就是你要做的:

HtmlDocument doc = new HtmlDocument();
doc.Load("yourfile.htm");

foreach (HtmlNode font in doc.DocumentNode.SelectNodes("//font"))
{
    font.ParentNode.RemoveChild(font, true);
}

編輯:看起來像替換w / keepGrandChildren選項沒有按預期工作,所以這是一個替代實現:

public static HtmlNode RemoveChild(HtmlNode parent, HtmlNode oldChild, bool keepGrandChildren)
{
    if (oldChild == null)
        throw new ArgumentNullException("oldChild");

    if (oldChild.HasChildNodes && keepGrandChildren)
    {
        HtmlNode prev = oldChild.PreviousSibling;
        List<HtmlNode> nodes = new List<HtmlNode>(oldChild.ChildNodes.Cast<HtmlNode>());
        nodes.Sort(new StreamPositionComparer());
        foreach (HtmlNode grandchild in nodes)
        {
            parent.InsertAfter(grandchild, prev);
        }
    }
    parent.RemoveChild(oldChild);
    return oldChild;
}

// this helper class allows to sort nodes using their position in the file.
private class StreamPositionComparer : IComparer<HtmlNode>
{
    int IComparer<HtmlNode>.Compare(HtmlNode x, HtmlNode y)
    {
        return y.StreamPosition.CompareTo(x.StreamPosition);
    }
}

熱門答案

你可以嘗試使用AngleSharp https://github.com/AngleSharp/AngleSharp

var parser = new HtmlParser();
var document = parser.Parse(html);

using (var writer = new StringWriter())
{
    document.ToHtml(writer, new PrettyMarkupFormatter());
    return writer.ToString();
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因