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

如何从<div><ul><li><a>爬取文本?修复Ruby Nokogiri爬取代码问题

爬取Bananatic网站Games板块游戏数据的问题修复

需求说明

我需要爬取网站https://www.bananatic.com/es/forum/games/中「Games」板块的游戏数据。该数据位于class为scrollArea的<div>内,结构为<div>下的<ul>包含<li>,每个<li>内有<a>和<span>标签。要求将<a>的文本保存为游戏名称变量,<span>中的数字保存为帖子数变量,控制台输出格式如下:

Roblox
146
BigFarm
135……

原错误代码

require 'nokogiri'
require 'csv'
require 'open-uri'

link = 'https://www.bananatic.com/es/forum/games/'
pagina = URI.open(link)
datos = pagina.read
documento = Nokogiri::HTML(datos)
#p =     documento.css('.container').css('.categories').css('.scrollArea')
r = documento.css('.categories')
# print r
result = r.css('div.scrollArea > ul > li').each do |li|
   name = li.css('span').text.strip
   print name

  number = li.css('a').text.strip
  print number
end

问题分析

原代码存在两个关键问题:

  • 选择器对应关系颠倒:需求中<a>标签存储游戏名称,<span>标签存储数字,但代码里把两者的获取逻辑搞反了
  • 输出无换行:使用print输出会导致游戏名和数字连在一起,无法区分

修复后的代码

require 'nokogiri'
require 'open-uri'

link = 'https://www.bananatic.com/es/forum/games/'
# 解决部分环境下的SSL验证报错问题
pagina = URI.open(link, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
datos = pagina.read
documento = Nokogiri::HTML(datos)

# 直接定位到目标li元素,简化选择器
documento.css('.scrollArea ul li').each do |li|
  # 获取<a>标签文本作为游戏名称
  game_name = li.css('a').text.strip
  # 获取<span>标签文本作为数字
  post_count = li.css('span').text.strip
  
  # 按要求换行输出
  puts game_name
  puts post_count
end

修复说明

  1. 修正了游戏名与数字的选择器对应关系,匹配需求逻辑
  2. 改用puts输出实现换行,让结果格式符合要求
  3. 添加SSL验证关闭参数,避免部分环境下的访问失败
  4. 简化选择器写法,直接定位目标元素,提升代码可读性

内容的提问来源于stack exchange,提问作者Cindy Adriana Bohrquez Santana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:50:31