Ruby中Nokogiri库进阶使用与XML数据解析技巧
时间:2026-08-18 | 作者:冻月看渠 | 阅读:0一、基础语法
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 处理命名空间的便捷之处——多数情况下,你甚至感觉不到它的存在。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 使用RVM切换Ruby与Rails版本的实现方法
- 时间:2026-08-18
-
- Ruby语言是什么及入门使用方法
- 时间:2026-08-18
-
- Ruby on Rails网站项目搭建入门指南
- 时间:2026-08-18
-
- Ruby插入排序算法实现与二路插入排序代码示例
- 时间:2026-08-18
-
- Ruby图片滤镜算法实现代码与核心原理
- 时间:2026-08-18
-
- Ruby中Hash哈希结构基本操作方法详解
- 时间:2026-08-18
-
- Ruby面向对象编程:类方法与类扩展详解
- 时间:2026-08-18
-
- Ruby正则表达式语法详解与常用示例代码
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
