如何將 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 文件。