如何使用Nokogiri解析银行网页表格并提取近6个月的交易数据
实现方案
核心思路
- 预先计算6个月前的截止日期,不需要提前拉取全量数据校验
- 利用银行交易表默认按时间倒序排列(最新记录在前)的特性,遍历行时一旦遇到早于截止日期的记录,直接终止遍历即可
- 遍历每行时优先提取日期字段做校验,符合时间范围再处理其余交易信息
优化后代码
require 'date' def get_transactions # 计算6个月前的截止日期 cutoff_date = Date.today << 6 # 原有页面跳转逻辑 $b.a(:href => "#/history_operations").click! sleep 5 doc = Nokogiri::HTML.parse($b.html) table = doc.css('#simpleTable0') table.search('tr').each do |tr| # 提取日期字段,需替换为实际表格日期列的选择器,演示页日期一般在对应日期类的节点中 date_str = tr.css('.operationDate').text.strip # 跳过表头、空行等无有效日期的行 next if date_str.empty? # 解析日期,适配演示页的dd.mm.yyyy格式 begin transaction_date = Date.strptime(date_str, '%d.%m.%Y') rescue Date::Error next end # 遇到早于截止日期的记录直接终止遍历,后面的记录时间更早无需处理 break if transaction_date < cutoff_date # 以下是原有交易描述处理逻辑 payment_description = tr.search('.paymentDescription').text p = payment_description.split(' ', -1) p.each do |i| puts i.delete(' ') end end end
注意事项
- 需将代码中
.operationDate替换为你实际表格中日期列对应的CSS选择器,可通过浏览器F12检查元素获取 - 若你的表格是按时间正序排列,将
break改为next即可,银行流水普遍为倒序排列,用break可最大化提升爬取效率 - 如日期格式和示例不同,调整
Date.strptime的第二个参数适配即可
内容的提问来源于stack exchange,提问作者dreeeeeedd
相关产品推荐
相关产品推荐

