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

Ruby使用Nokogiri抓取网页时过滤空name字段的问题求助

解决Nokogiri抓取论坛内容时name字段空值问题

问题根源

  1. 原代码里的links2 = document.css('.topics ul li div')匹配了帖子条目内的所有div,包括没有.name类的无关元素,导致这些元素提取到的name为空。
  2. 用to_s[/\w+/]提取文本时,会匹配到任意单词字符,可能抓到隐藏元素的零散字符(比如'a'),同时空白内容会返回nil,造成数组里的空值和无效内容。

修正后的完整代码

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

# 缓存网页内容(避免重复请求)
unless File.readable?('data.html')
  url = 'https://www.bananatic.com/es/forum/games/' # 注意原代码用了de域名,这里改为目标es域名
  data = URI.open(url).read
  File.open('data.html', 'wb') { |f| f << data }
end

document = Nokogiri::HTML(File.read('data.html'))

# 提取replies(回复数):精准匹配数字
replies = document.xpath('//div[@class="replies"]/text()[normalize-space(.) != ""]')
                  .map { |node| node.text.strip.match(/\d+/)[0] rescue nil }
                  .compact

# 提取views(浏览数):精准匹配数字
views = document.xpath('//div[@class="views"]/text()[normalize-space(.) != ""]')
                .map { |node| node.text.strip.match(/\d+/)[0] rescue nil }
                .compact

# 提取name(帖子标题):仅保留非空有效文本
names = document.css('.topics ul li') # 直接定位每个帖子的根容器
                .map do |post|
                  title_node = post.css('.name p a').first
                  title_node ? title_node.text.strip : nil
                end
                .compact # 移除所有空值和nil

# 输出整理后的结果
pp replies: replies, views: views, names: names

关键优化点

  • 选择器精准化:用.topics ul li直接定位每个帖子的根节点,避免匹配无关div元素。
  • 文本提取逻辑:先检查标题节点是否存在,再调用text.strip去除文本前后的空白字符(换行、空格等),避免空字符串。
  • 过滤无效内容:用compact移除数组中的nil值,确保最终数组只有有效文本。
  • 数字提取优化:用match(/\d+/)[0]精准提取数字,配合rescue nil处理意外情况,再用compact清理无效值。

内容的提问来源于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.03 22:25:12