如何使用HTMLAgilityPack修复缺少<open>和<close>标签的HTML标记

10
使用HTML Agility Pack,有可能修复这种类似的缺少闭合和开放标签的问题吗?

我有一个包含 <div><h1> hello Hi</div> <div>hi </p></div> 的html。

所需输出:<div><h1> hello </h1></div> <div><p>hi </p></div>

2个回答

14

这个库并不足够智能以在你放置的位置创建开头的p标签,但它足够智能以创建缺失的h1标签。通常情况下,它总是创建有效的HTML代码,但并不总是你所期望的。

因此,这段代码:

        HtmlDocument doc = new HtmlDocument();
        doc.Load(yourhtml);
        doc.Save(Console.Out);

会丢弃这个:

<div><h1> hello Hi</h1></div> <div>hi <p></div>

虽然这不是您想要的,但它是有效的HTML。 您还可以添加一些诀窍,如:

        HtmlNode.ElementsFlags["p"] = HtmlElementFlag.Closed;
        HtmlDocument doc = new HtmlDocument();
        doc.Load(yourhtml);
        doc.Save(Console.Out);

那会将此内容丢弃:

<div><h1> hello Hi</h1></div> <div>hi <p></p></div>

它只是不是<p>节点。总的来说,我正在寻找一个解决方案,可以处理所有缺失的开放标签。有什么方法可以做到这一点吗? - ragmn
1
该库可以自动修复所有损坏的标签,但正如我所说,它可能不是您想要的方式。由于问题过于普遍,很难再详细说明了。 - Simon Mourier
好的,听起来很不错,谢谢!您能告诉我如何将输出保存到字符串中而不是Console.Out吗? - ragmn
2
doc.DocumentNode.OuterHtml 包含整个文档的文本。 - Simon Mourier
我可能有点晚加入这个对话,但是否有办法关闭自动修复破损标签的功能?我不想要它(我正在代理,并且在更正后客户端会中断),但我认为HAP无法处理错误的html。 - big_tommy_7bb
@tim_barber_7BB: 是的,基本上是这样。你所做的很多事情(例如请求子节点)如果没有明确定义的结构就无法工作。如果有无效的HTML,它需要对其进行某些处理才能理解它,然后将其返回给您。我怀疑经过一些操作,再把这些损坏的部分放回去几乎是不可能的(而且很少需要,不值得努力)。 - Chris

13

当使用 HtmlAgilityPack.HtmlDocument.LoadHTML(yourhtml) 时,HTMLAgilityPack会自动修复标签,然后您可以使用 HtmlAgilityPack.HtmlDocument.DocumentNode.OuterHTML 访问这些标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接