[翻译][Nokogiri官方教程] 解析HTML/XML文档 / Parsing an HTML/XML Document
-
From a String
- From a File
- From the Internet
- Parse Options
- Encoding
原文: Parsing an HTML/XML Document
解析HTML/XML文档
从字符串读取
1 html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>") 2 xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
变量 html_doc
与 xml_doc
是Nokogiri 对象1, 具有各种属性与方法, 具体见此. 这些具体内容会在其他章节讲述.
*1 原文为documents, 在此译为"对象"
从文件读取
无需读取文件到字符串. Nokogiri会进行这项工作.
1 doc = File.open("blossom.xml") { |f| Nokogiri::XML(f) }
从网络读取
1 require 'open-uri' 2 doc = Nokogiri::HTML(open("http://www.threescompany.com/"))
解析选项(Parse Options)
Nokogiri提供了一些影响解析方式的选项. 详见: read about them here, 以下是最常用的选项:
NOBLANKS
- Remove blank nodesNOENT
- Substitute entitiesNOERROR
- Suppress error reportsSTRICT
- Strict parsing; raise an error when parsing malformed documentsNONET
- Prevent any network connections during parsing. Recommended for parsing untrusted documents.
用法:
1 doc = Nokogiri::XML(File.open("blossom.xml")) do |config| 2 config.strict.nonet 3 end
或
1 doc = Nokogiri::XML(File.open("blossom.xml")) do |config| 2 config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NONET 3 end
编码
在程序内部, 字符串正常是以UTF-8编码储存. 返回文本值的方法将会返回UTF-8字符串. 返回XML的方法(例如to_xml, to_html, inner_html)会返回与源文件相同编码方式的字符串.
注意 / WARNING
某些文档声明了特定的编码方式, 但实际是用的却是另外一种. 这种情况下解析器会使用哪一种编码?
所谓的数据仅仅是由一个一个的字节组成的长串. 我们人为地为它附加了含义. 同样的一组字节在不同的编码下代表着一些互不相同的字符, 因此100%准确地推断出编码是不可能的. 即使做的相当好的libxml2库也不能总是成功地推断出编码.
让Nokogiri使用正确的编码方式来处理文档的最好方式就是显示设定编码. 以下为示例:
1 doc = Nokogiri.XML('<foo><bar /><foo>', nil, 'EUC-JP')