You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历Ruby中Oga gem返回的GrabFeedFromJSE对象?

解决Oga NodeSet遍历与数据访问问题

看起来你现在的问题主要有两个:一是混淆了Oga和Nokogiri的API用法,二是变量指向可能搞混了(报错显示@output是你的GrabFeedFromJSE实例,而非Oga的NodeSet)。我来一步步帮你理清:

1. 先修正变量指向问题

从你打印的实例信息来看,你的GrabFeedFromJSE对象里有一个@titles属性,它才是Oga执行xpath后返回的NodeSet。但你目前直接在实例上调用方法(比如@output.titles)报错,说明你的类没有暴露这个属性。先给类加上属性读取器:

class GrabFeedFromJSE
  attr_reader :titles # 让外部能访问内部的@titles变量
  # ... 你的其他代码 ...

  def some_method
    # 假设你在这里执行xpath并赋值给@titles
    document = Oga.parse_html(your_html_content)
    @titles = document.xpath('//li/a')
  end
end

之后你就能通过实例拿到正确的NodeSet了:

grabber = GrabFeedFromJSE.new
node_set = grabber.titles # 这才是你要遍历的Oga NodeSet

2. 遍历Oga NodeSet的正确姿势

Oga的NodeSet实现了Ruby的Enumerable接口,所以你可以用常规的遍历方法(比如each)来处理每个元素。同时要注意用Oga自己的API,不要照搬Nokogiri的方法:

示例:提取每个标签的关键数据

node_set.each do |a_tag|
  # 获取href属性
  href = a_tag.get('href')
  # 或者更严谨的写法(避免属性不存在时出错)
  href = a_tag.attributes['href']&.value

  # 清理文本内容(原文本有大量换行和空格)
  raw_text = a_tag.text
  cleaned_text = raw_text.strip.gsub(/\s+/, ' ')

  # 提取子元素(比如img标签的src)
  img_tag = a_tag.at('img') # Oga用at()获取第一个匹配的子元素,类似Nokogiri的at_xpath
  img_src = img_tag&.get('src')

  # 打印或处理数据
  puts "链接:#{href}"
  puts "文本:#{cleaned_text}"
  puts "图标:#{img_src}"
end

3. Oga常用元素操作方法

给你整理几个常用的Oga方法,替代你之前尝试的Nokogiri方法:

  • 获取属性:element.get('attr_name') 或 element.attributes['attr_name'].value
  • 查找子元素:element.xpath('xpath')(返回NodeSet);element.at('xpath')(返回第一个匹配元素)
  • 获取所有文本:element.text
  • 遍历子节点:element.children.each { |child| ... }

这样调整后,你应该就能顺利访问和遍历Oga返回的节点数据了。

内容的提问来源于stack exchange,提问作者marcamillion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:50:44