如何将 HTML 或 XML 解析为 Nokogiri XML 或 HTML 文档

Nokogiri 的“ 解析 HTML / XML 文档 ”教程没有太多内容,这是一个简单的主题介绍,所以从那里开始,然后返回到这个页面来帮助填补一些空白。

Nokogiri 的基本解析尝试清理格式错误的文档,有时添加缺少的结束标记,并添加一些额外的标记以使其正确。

这是告诉 Nokogiri 正在解析的文档是一个完整的 HTML 文件的例子,Nokogiri 发现它不是:

require 'nokogiri'

doc = Nokogiri::HTML('<body></body>')
puts doc.to_html 

哪个输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body></body></html>

请注意,添加了 DTD 语句以及包装 <html> 标记。

如果我们想避免这种情况,我们可以将文档解析为 DocumentFragment:

require 'nokogiri'

doc = Nokogiri::HTML.fragment('<body></body>')
puts doc.to_html 

现在只输出实际传入的内容:

<body></body>

还有一个 XML 变体:

require 'nokogiri'

doc = Nokogiri::XML('<node />')
puts doc.to_xml

哪个输出:

<?xml version="1.0"?>
<node/>

和:

doc = Nokogiri::XML.fragment('<node />')
puts doc.to_xml

导致:

<node/>

fragment 的更详细的变化是使用 DocumentFragment.parse,所以有时你会看到它以这种方式编写。

偶尔,Nokogiri 将不得不做一些修复工作来尝试理解文档:

doc = Nokogiri::XML::DocumentFragment.parse('<node ><foo/>')
puts doc.to_xml

修改后的代码现在是:

<node>
  <foo/>
</node>

HTML 也是如此。

有时文档会被 Nokogiri 修复它的能力所破坏,但无论如何都会尝试,导致文档的层次结构发生变化。Nokogiri 不会引发异常,但它确实提供了一种检查错误及其所采取措施的方法。有关详细信息,请参阅“ 如何检查解析错误 ”。

有关解析时使用的各种选项,请参阅 Nokogiri::XML::ParseOptions 文档。