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



我正在尝试使用整洁的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"

相关内容

  • 没有找到相关文章

最新更新