【问题标题】:Parse an HTML fragment whitelisting some custom tags解析将一些自定义标签列入白名单的 HTML 片段
【发布时间】:2016-07-16 16:13:24
【问题描述】:

我正在尝试使用 Nokogiri 解析包含自定义 HTML 标记的 HTML 片段。

例子:

string = "<div>hello</div>\n<custom-tag></custom-tag>"

我尝试以多种方式加载它,但没有一个是最佳的。

如果我使用 Nokogiri::HTML:

doc = Nokogiri::HTML(string)

当我使用to_html 时,它会添加一个doctype 和一个包装内容的html 标记。这是不受欢迎的。

如果我使用 Nokogiri::XML:

doc = Nokogiri::XML(string)

我得到了Error at line 2: Extra content at the end of the document,因为在 XML 中必须有一个包含所有文档内容的根标记。如果我再次尝试保存此内容,则输出为&lt;div&gt;hello&lt;/div&gt;(删除第一个标签之后的每个标签)

我也试过doc = Nokogiri::HTML.fragment:

doc = Nokogiri::HTML.fragment(string)

但它抱怨custom-tag

如何使用这个 HTML 片段正确解析 Nokogiri?

【问题讨论】:

  • 您的预期结果是什么?
  • @AmitSharma 我希望在 HTML 中解析没有错误的字符串,即使它包含 custom-tag。我需要进行一些 xpath 查询,编辑内容,并无错误地序列化回 html。
  • 你试过这个doc = Nokogiri::HTML(string).inner_html 吗?
  • @RORDeveloper 尝试检查doc.errors。我应该忽略它们吗?如何确保内容完好无损? @AmitSharma inner_html 似乎和to_html 一样工作...
  • @ProGM inner_html 不会添加doctype,但会使用html 包装内容

标签: html ruby nokogiri


【解决方案1】:

doc = Nokogiri::HTML.fragment(string) 是要走的路,你可以忽略doc.errors 抱怨标签无效。

给了它无效的 HTML,所以你不能指望它不报告错误,但 HTML 解析器往往是宽容的。

如果您确定其余部分格式正确,您也可以使用Nokogiri::XML.fragment。这不会给你关于未定义标签的错误。

【讨论】:

  • 浏览器中的 HTML 解析器并不宽容,它们只是试图提供帮助,并且会重写 HTML,直到它在语法上正确,即使它不是最初的意图。 Nokogiri 也会做一些修复。知道doc.errors 表示存在问题很重要,因为标签可以在修复期间移动。允许 Nokogiri 将内容解析为 XML 片段可能是最简单的,因为 XML 更能接受未知标签,但它仍然具有 HTML 所没有的严格语法,因此它可能无法解决所有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2016-07-07
相关资源
最近更新 更多