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
相关产品推荐
相关产品推荐

