如何将 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 文档。