1

我正在尝试使用tidy-ext gem整理一些检索到的 HTML 。但是,当 HTML 完全损坏时它会失败,所以我首先尝试使用 Nokogiri 修复 HTML:

repaired_html = Nokogiri::HTML.parse(a.raw_html).to_html

它似乎做得很好,但最近我遇到了一个示例,其中人们将 FBML 标记插入 HTML 文档,例如<fb:like>Nokogiri 以某种方式保留了该标记,尽管它是无效的。Tidy 然后说Error: <fb:like> is not recognized!这是可以理解的。

我想知道是否还有其他选项,例如严格或强制 Nokogiri 仅包含有效的 HTML 标记并忽略其他所有内容?

4

1 回答 1

0

您可以使用 Nokogiri 的 XML 解析器来解析 HTML,默认情况下它是严格的,但只提供一点帮助,因为它仍然会进行修复,因此 HTML/XML 稍微正确。通过调整您可以传递给解析器的标志,您可以使 Nokogiri 更加严格,因此它将拒绝返回无效文档。Nokogiri 不是消毒剂或所需标签的白名单。查看LoofahSanitize以了解该功能。

如果您的 HTML 内容位于名为 的变量中html,并且您执行以下操作:

doc = Nokogiri::XML.parse(html)

然后检查doc.errors是否有错误。Nokogiri 将尝试修复它们,但任何产生错误的东西都会被标记在那里。

例如:

Nokogiri::XML('<fb:like></fb:like>').errors
=> [#<Nokogiri::XML::SyntaxError: Namespace prefix fb on like is not defined>]

Nokogiri 将尝试修复 HTML:

Nokogiri::XML('<fb:like></fb:like>').to_xml
=> "<?xml version=\"1.0\"?>\n<like/>\n"

但它只会将其纠正到删除标记上的未知名称空间的程度。

如果要剥离这些节点:

doc = Nokogiri::XML('<fb:like></fb:like>')
doc.search('like').each{ |n| n.remove }
doc.to_xml => "<?xml version=\"1.0\"?>\n"
于 2012-07-19T09:22:00.660 回答