Scrapy爬取数据触发Unshapable list错误 输出格式不符合预期
Scrapy提取网页出现Unshapable list报错修复方案
问题背景
- 爬取目标:波兰律师登记平台公开信息,示例详情页:https://rejestradwokatow.pl/adwokat/abaewicz-agnieszka-51004
- 原有问题代码:
import scrapy from scrapy.http import Request from scrapy.crawler import CrawlerProcess class TestSpider(scrapy.Spider): name = 'test' start_urls = ['https://rejestradwokatow.pl/adwokat/list/strona/1/sta/2,3,9'] custom_settings = { 'CONCURRENT_REQUESTS_PER_DOMAIN': 1, 'DOWNLOAD_DELAY': 1, 'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' } def parse(self, response): wev={} tic = response.xpath("//div[@class='line_list_K']//div//span//text()").getall() det = response.xpath("//div[@class='line_list_K']//div//div//text()").getall() wev[tuple(tic)]=[i.strip() for i in det] yield wev
- 错误表现:运行后输出格式异常,触发
Unshapable list报错,错误输出效果:
- 预期目标:输出字段名与值一一匹配的结构化字典,效果参考:

报错原因
原有逻辑一次性全局提取所有span节点的文本作为字段名集合、所有div节点的文本作为值集合,存在两个核心问题:
- 把整个字段名元组作为字典的key,不符合Scrapy Item输出的格式要求,直接触发
Unshapable list报错 - 全局跨节点提取没有绑定字段和值的对应关系,很容易因为页面DOM结构差异、空节点、多值节点出现键值数量不匹配、内容错位的问题。
修复代码
核心调整为逐行遍历信息条目容器,在单个条目内配对提取字段名和对应值,从根源避免错位和格式错误:
def parse(self, response): wev = {} # 遍历信息区每一行条目,每个条目对应一组键值对 for row in response.xpath("//div[@class='line_list_K']/div"): # 提取当前行字段名,去除空白和末尾冒号 key = row.xpath(".//span/text()").get(default="").strip().rstrip(":") if not key: continue # 提取当前行所有有效值,自动过滤空文本 values = [txt.strip() for txt in row.xpath(".//div//text()").getall() if txt.strip()] # 单值字段存字符串,多值字段(比如多个邮箱、多个执业方向)存列表 wev[key] = values[0] if len(values) == 1 else values yield wev
修复效果
- 彻底解决
Unshapable list报错,输出格式完全符合结构化字典要求 - 键值严格一一对应,不会出现内容错位、字段缺失问题
- 自动兼容单值、多值字段场景,和预期输出格式完全对齐
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

