Ruby的XML格式数据解析库Nokogiri的使用进阶
一、基础语法 Nokogiri 是 Ruby 里处理 XML/HTML 的利器,上手其实非常直观。核心思路就一句话:把文本或文件变成可查询的对象,然后通过各种方式取数据。先看三种最常见的对象生成方式。 直接在代码里写字符串就行,Nokogiri 会自动解析成文档对象: html_doc = Noko
一、基础语法
Nokogiri 是 Ruby 里处理 XML/HTML 的利器,上手其实非常直观。核心思路就一句话:把文本或文件变成可查询的对象,然后通过各种方式取数据。先看三种最常见的对象生成方式。
直接在代码里写字符串就行,Nokogiri 会自动解析成文档对象:
html_doc = Nokogiri::HTML("Mr. Belvedere Fan Club
")
xml_doc = Nokogiri::XML("Alf ")
这里的 html_doc 和 xml_doc 就是标准的 Nokogiri 文档对象,后面所有操作都基于它。
当然,也可以从本地文件读取:
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close
更常见的场景是从网上抓取页面,配合 open-uri 一行搞定:
require 'open-uri'
doc = Nokogiri::HTML(open("http://www.xxx.com/"))

二、XML 文件解析实例
拿到文档对象后,最核心的需求就是提取特定字段。Nokogiri 提供了两种查询方式:XPath 和 CSS 选择器。下面用一个典型的数据文件 shows.xml 来演示,内容如下:
Married with Children Al Bundy Bud Bundy Marcy Darcy Perfect Strangers Larry Appleton Balki Bartokomous The A-Team John "Hannibal" Smith Templeton "Face" Peck "B.A." Baracus "Howling Mad" Murdock
如果想抓出所有 标签的内容,用 XPath 的 //character 即可:
@doc = Nokogiri::XML(File.open("shows.xml"))
@doc.xpath("//character")
这里的 xpath 和 css 方法返回的都是节点列表(类似数组),包含了文档中所有匹配的节点。
如果只想查 dramas 里的角色,可以加路径限制:
@doc.xpath("//dramas//character")
CSS 选择器的可读性更好,比如查所有情景剧的名称:
characters = @doc.css("sitcoms name")
# => ["Married with Children ", "Perfect Strangers "]
当结果唯一时,直接用 at_xpath 或 at_css 可以省去 .first:
@doc.css("dramas name").first # => "The A-Team "
@doc.at_css("dramas name") # => "The A-Team "
三、Namespaces
当 XML 里出现多个同名标签但属于不同命名空间时,命名空间就显得格外重要。举个例子,下面这个 parts.xml 里有两个 ,分别来自不同供应商,里面的 含义完全不同:
all weather studded extra wide street mountain
这时可以用唯一的 URL 作为命名空间前缀来区分:
@doc = Nokogiri::XML(File.read("parts.xml"))
car_tires = @doc.xpath('//car:tire', 'car' => 'http://alicesautoparts.com/')
bike_tires = @doc.xpath('//bike:tire', 'bike' => 'http://bobsbikes.com/')
有趣的是,Nokogiri 会自动绑定根节点上找到的命名空间,这让日常使用省了不少事。比如一个标准的 Atom 订阅文件:
Example Feed 2003-12-13T18:30:02Z John Doe urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 Atom-Powered Robots Run Amok urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a 2003-12-13T18:30:02Z Some text.
由于根节点的 xmlns 已被自动绑定,可以直接用 xmlns 这个前缀来查询:
@doc.xpath('//xmlns:title')
# => ["Example Feed ", "Atom-Powered Robots Run Amok "]
CSS 方式也类似,只需要换用管道符分隔:
@doc.css('xmlns|title')
更省事的是,如果命名空间名字就是 xmlns,连前缀都可以忽略,直接写标签名:
@doc.css('title')
这就是 Nokogiri 处理命名空间的便捷之处——多数情况下,你甚至感觉不到它的存在。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















