Nokogiri 是 Ruby 中最常用的 HTML/XML 解析库,用 XPath 搜索高效直接;加载文档后调用 search 返回 NodeSet,at 返回单个 Element,支持丰富 XPath 语法及命名空间处理。

Nokogiri 是 Ruby 中最常用的 HTML/XML 解析库,用 XPath 搜索非常直接高效。核心就是调用 search 或 at 方法,传入合法的 XPath 表达式。
基础用法:加载文档后直接 search
先解析 HTML 或 XML 字符串(或文件),再用 search 返回所有匹配节点(NodeSet),用 at 返回第一个匹配节点(Element):
require 'nokogiri'html = '
' doc = Nokogiri::HTML(html)Hello
World
查找所有 p 标签
ps = doc.search('//p') # → NodeSet 包含两个
查找带 class="intro" 的 p 标签
intro_p = doc.at('//p[@class="intro"]') # → Element 对象
获取文本内容
intro_p.text # → "Hello"
常用 XPath 写法示例
XPath 支持丰富语法,以下是最常遇到的几种场景:
- //div[@id='main'] —— 查找任意层级下 id 为 main 的 div
- //a[contains(@href, 'github')] —— href 属性包含 "github" 的链接
- //ul/li[1] —— 第一个 li 子元素(注意:XPath 索引从 1 开始)
- //input[@type='text' and @name] —— type=text 且有 name 属性的 input
- //div//span —— div 内任意深度的 span(后代,非直系子元素)
-
//div/child::span —— div 的直接子 span(等价于
//div/span)
处理结果:NodeSet 和 Element
search 返回的是 Nokogiri::XML::NodeSet,可像数组一样遍历或索引;at 返回单个 Nokogiri::XML::Element,更轻量:
- 遍历结果:
doc.search('//a').each { |a| puts a['href'] } - 取第一个:
doc.search('//img').first['src']或doc.at('//img')['src'] - 检查是否存在:
doc.at('//button[@disabled]') ? '禁用中' : '可用' - 提取多个属性:
doc.search('//meta').map { |m| [m['name'], m['content']] }
注意命名空间和 HTML 特殊性
如果是 XML 且含命名空间(如 SVG、Atom),需先声明前缀:
xml = '... ' doc = Nokogiri::XML(xml) doc.search('//dc:creator', 'dc' => 'http://purl.org/dc/elements/1.1/')
而对 HTML 文档,Nokogiri 默认使用宽松解析,XPath 大多能直接用。但注意:
– HTML 标签名不区分大小写,但 XPath 表达式里建议用小写(//div 而非 //DIV);
– 某些属性名在 HTML 中是布尔型(如 checked),XPath 中仍用 [@checked] 判断是否存在即可。
基本上就这些。XPath 写熟了,配合 Nokogiri 的 search/at,抓取和校验结构化内容非常顺手。










