我正在尝试使用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标签并忽略其他所有内容的东西?
答案 0 :(得分:0)
您可以使用Nokogiri的XML解析器解析HTML,默认情况下这是严格的,但这只会有所帮助,因为它仍然会进行修正,因此HTML / XML非常正确。通过调整您可以传递给解析器的标志,您可以使Nokogiri更加严格,因此它将拒绝返回无效文档。 Nokogiri不是消毒剂或所需标签的白名单。查看Loofah和Sanitize了解该功能。
如果您的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"