我正在尝试使用整洁的extgem整理一些检索到的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标记,而忽略其他所有内容?
您可以使用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"