使用Nokogiri是解析Ruby中XML feed的最佳方式,支持高效处理RSS和Atom。首先安装nokogiri gem,通过require引入nokogiri和open-uri库,获取远程XML内容并用Nokogiri::XML解析。对RSS使用xpath('//item')遍历条目,提取title和link;解析Atom时注意命名空间,可移除或正确处理。也可用内置REXML库解析,但性能较低,适合小规模应用。常见建议包括添加User-Agent头、处理编码、封装代码复用。总结:推荐Nokogiri,结构清晰,功能强大。

Ruby解析XML feed(如RSS或Atom)并不复杂,常用的方法是借助标准库中的rexml或更高效的第三方库如nokogiri。下面介绍如何使用这两种方式来读取和解析常见的RSS/Atom订阅源。
1. 安装 Nokogiri
在终端运行:
或将它加入你的 Gemfile:
gem 'nokogiri'2. 获取并解析 RSS 示例
以下代码从一个RSS地址获取内容,并提取每篇文章的标题和链接:
require 'nokogiri'
require 'open-uri'
url = 'https://www.php.cn/link/2f8ad0a8b0f357680b14408c30c53a11'
doc = Nokogiri::XML(open(url))
doc.xpath('//item').each do |item|
title = item.at_xpath('title') && item.at_xpath('title').content
link = item.at_xpath('link') && item.at_xpath('link').content
puts "标题: #{title}, 链接: #{link}"
end
3. 解析 Atom Feed 的例子
Atom 使用不同的标签命名空间,注意命名空间处理:
url = 'https://www.php.cn/link/2dfb6bf59bf35a07d6787f7f04c28e11'
doc = Nokogiri::XML(open(url))
namespaces = doc.namespaces
doc.remove_namespaces! # 简化处理(可选)
doc.xpath('//entry').each do |entry|
title = entry.at_xpath('title') && entry.at_xpath('title').content
link = entry.at_xpath('link/@href') && entry.at_xpath('link/@href').value
puts "文章: #{title} => #{link}"
end
rexml 库。示例:读取本地或远程 RSS
require 'rexml/document'
require 'open-uri'
content = open('https://www.php.cn/link/2f8ad0a8b0f357680b14408c30c53a11').read
doc = REXML::Document.new(content)
REXML::XPath.each(doc, '//item') do |item|
title = item.elements['title'] && item.elements['title'].text
link = item.elements['link'] && item.elements['link'].text
puts "标题: #{title} - 链接: #{link}"
end
注意:REXML 性能较低,不适合大文件或高频解析,适合小型脚本。
open(url, 'User-Agent' => 'Ruby') 模拟浏览器。Nokogiri 是 Ruby 中解析 XML feed 的最佳实践,语法清晰、性能好、社区支持强。对于简单场景,REXML 也能胜任。无论是处理 RSS 还是 Atom,关键是熟悉结构并正确提取节点。基本上就这些,动手试试抓取你喜欢的博客或新闻源吧。
以上就是Ruby怎么解析XML feed (如RSS/Atom)_Ruby解析XML feed教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号