位置:首页 > Ruby > Ruby中Nokogiri库进阶使用与XML数据解析技巧

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_docxml_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/"))

Ruby的XML格式数据解析库Nokogiri的使用进阶

二、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")

这里的 xpathcss 方法返回的都是节点列表(类似数组),包含了文档中所有匹配的节点。

如果只想查 dramas 里的角色,可以加路径限制:

@doc.xpath("//dramas//character")

CSS 选择器的可读性更好,比如查所有情景剧的名称:

characters = @doc.css("sitcoms name")
# => ["Married with Children", "Perfect Strangers"]

当结果唯一时,直接用 at_xpathat_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 处理命名空间的便捷之处——多数情况下,你甚至感觉不到它的存在。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多