使用Nokogiri修复无效的HTML(删除无效标记)

时间:2012-07-19 09:09:55

标签: html ruby html-parsing nokogiri

我正在尝试使用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!这是可以理解的。

我想知道是否还有其他选项,例如 strict 或强迫Nokogiri只包含有效HTML标签并忽略其他所有内容的东西?

1 个答案:

答案 0 :(得分: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"