如何使用HTML Agility Pack清理格式错误的HTML

问题描述 投票:8回答:3

我试图替换这个神可怕的正则表达式集合,这些正则表达式目前用于清理格式不良的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()方法时,它删除节点及其所有子节点。有没有办法删除保留孩子的节点?

c# asp.net html html-agility-pack
3个回答
7
投票

在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);
    }
}

2
投票

您可以尝试使用AngleSharp代替。

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

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

-1
投票

一旦找到了

element使用InnerText方法获取文本,然后执行remove,然后插入文本。

© www.soinside.com 2019 - 2024. All rights reserved.