运行Scrapy爬虫代码报错TypeError: Selector对象不可迭代问题求助
错误原因与修复方案
核心报错原因
报错TypeError: 'Selector' object is not iterable的直接原因是:Tabel=response.xpath('//table[contains(@class,"wikitable sortable")]')[0] 执行后,Tabel是单个Selector对象,不支持for循环遍历操作,你对单个非可迭代对象执行遍历逻辑才触发了该错误。
其他附带逻辑问题
除了遍历逻辑错误外,代码还有两处明显问题:
allowed_domains配置错误:目标站点域名是wikipedia.org,不是wikipedia.com,配置错误会导致后续请求被Scrapy的离线中间件拦截- xpath提取逻辑错误:你需要遍历的是表格下的行数据,而不是表格本身,原xpath路径也没有正确定位到州名对应的节点
修复后的完整代码
from scrapy import Spider class WikiSpider(Spider): name = 'wiki' allowed_domains = ['wikipedia.org'] start_urls = ['https://en.wikipedia.org/wiki/List_of_states_and_territories_of_the_United_States'] def parse(self, response): # 直接定位目标表格下的所有行 rows = response.xpath('//table[contains(@class,"wikitable sortable")]/tbody/tr') for row in rows: # 逐行提取州名,增加判空避免索引越界 state = row.xpath('./th/a/text()').get() if state: yield { 'state': state }
代码修改说明
- 删除了对单个表格Selector的遍历逻辑,改为直接遍历表格下所有行的Selector列表
- 修正了域名配置,保证爬虫可以正常发起请求
- 优化了xpath路径,减少不必要的节点嵌套查询
- 使用
get()方法替代extract(),配合判空逻辑避免索引越界异常 - 给yield的字典增加了key,符合Scrapy item的标准输出格式
内容的提问来源于stack exchange,提问作者Abu Bakar Siddique
相关产品推荐
相关产品推荐

