如何从<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
修复说明
- 修正了游戏名与数字的选择器对应关系,匹配需求逻辑
- 改用
puts输出实现换行,让结果格式符合要求 - 添加SSL验证关闭参数,避免部分环境下的访问失败
- 简化选择器写法,直接定位目标元素,提升代码可读性
内容的提问来源于stack exchange,提问作者Cindy Adriana Bohrquez Santana
相关产品推荐
相关产品推荐

