【问题标题】:HtmlAgilityPack unable to parse html with <title/>HtmlAgilityPack 无法使用 <title/> 解析 html
【发布时间】:2020-05-13 18:32:41
【问题描述】:

我有以下 html 字符串(HTML 的简化版本,不受我控制):

<html>
  <head>
    <title/>
  </head>
  <body>
    <p>
      Hello How are you doing?
    </p>
  </body>
</html>

我正在使用以下代码使用 HtmlAgilityPack 对其进行解析:

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlStr);

但这是htmlDoc.DocumentNode.InnerHtml的值:

<html>
  <head>
    <title></title></head></html>

如您所见,没有正确解析 html。

经过反复试验,我注意到在将 html 字符串中的 &lt;title/&gt; 替换为 &lt;title&gt;&lt;/title&gt; 时,文档被正确解析。如何正确解析带有 HAP 的 HTML 文档?

小提琴链接:https://dotnetfiddle.net/CZv09l

编辑

源 html 字符串不在我的控制范围内,尽管在使用 HAP 解析之前,我可以替换所有自关闭的 &lt;title/&gt;,但我不确定对所有其他自关闭标签这样做是否可行,因为我发现 HAP 也不适用于 &lt;p/&gt;。或者有没有一种快速的方法可以用扩展版本替换所有自封闭标签? (我正在考虑这里的额外费用,因为在用户等待它们完成时,我可能需要为大约 70 个大型 html 文件执行此操作)

&lt;p/&gt; - https://dotnetfiddle.net/VGJ1G6 问题的小提琴链接

【问题讨论】:

  • 标题标签不应自闭,因此这是无效的 HTML。如果您对此有控制权,请填充标签或完全省略它。
  • @JonathonChase OP 声明输入不受他们控制。由于 HtmlAgilityPack 声明它们可以容忍格式错误的文档,这看起来像是一个错误。
  • 我已编辑问题以添加更多详细信息。感谢您迄今为止的所有帮助。

标签: c# html html-agility-pack


【解决方案1】:

您可以在源代码中找到解析html标签here的默认设置。更改 &lt;title&gt; 标签的设置有助于解析您的 html:

HtmlNode.ElementsFlags["title"] = HtmlElementFlag.Closed;

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);

Fiddler code.
同样,您可以轻松更改所有需要标签的默认行为。
还有已经为&lt;p&gt; 标签定义的设置:

HtmlDocument.DisableBehaviorTagP = false; //false for automatically closing

【讨论】:

  • 非常感谢您的帮助。我试图了解这些更改将如何影响其他 html 文档的解析?如果您还可以帮助了解这些枚举如何影响解析,HtmlElementFlag.Empty、HtmlElementFlag.CData、HtmlElementFlag.Closed。通过阅读 cmets,我有所了解,但仍然询问您是否可以提供更多详细信息。
  • 很遗憾,除了我从 cmets 那里得到的信息之外,我不知道更多细节,无法帮助您评估影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2016-11-20
  • 2010-12-03
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多