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

Scrapy爬取表格pClose/Diff字段缺失报列表索引越界错误

索引越界的核心原因

你当前使用tr.css('td ::text').extract()提取单元格文本的逻辑存在缺陷:

  • 该选择器只会抓取<td>标签下的直接文本节点,会自动过滤掉没有纯文本内容、只嵌套了图标/其他标签的单元格。
  • 你要获取的Diff列对应单元格内没有直接存储文本,数值写在<td>的title属性中,单元格内仅嵌入了涨跌箭头的图标标签;相邻的pClose列也存在同类嵌套结构,没有被当前选择器捕获,导致最终生成的stock_data列表长度只有7,有效索引范围是0-6,访问索引7自然会触发越界错误。
  • 另外你的代码还存在一个隐性bug:NepalLiveShareItem()对象是在for循环外初始化的,循环过程中会反复修改同一个item实例的属性,最终yield出去的所有条目都会被最后一行的股票数据覆盖。
修复代码

直接按列定位<td>节点,针对不同字段的存储方式单独提取,同时把item初始化挪到循环内部避免数据覆盖:

def parse(self, response):
    for tr in response.xpath("//table[@class='table table-hover live-trading sortable']//tbody//tr"):
        items = NepalLiveShareItem()
        tds = tr.css('td')
        # 过滤单元格数量不足的无效行(表头、汇总行等)
        if len(tds) < 9:
            continue
        # 逐列提取字段,对提取到的文本做去空白处理
        items['symbol'] = tds[0].css('::text').get().strip()
        items['ltp'] = tds[1].css('::text').get().strip()
        items['percent_change'] = tds[2].css('::text').get().strip()
        items['open'] = tds[3].css('::text').get().strip()
        items['high'] = tds[4].css('::text').get().strip()
        items['low'] = tds[5].css('::text').get().strip()
        items['qty'] = tds[6].css('::text').get().strip()
        items['pClose'] = tds[7].css('::text').get().strip()
        # Diff列数值从title属性提取
        items['Diff'] = tds[8].css('::attr(title)').get().strip()
        yield items

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:01:21