如何用Scrapy从嵌套类与div中按字段名提取目标文本?
解决Scrapy抓取多列动态位置字段的方案
核心思路
不用按列拆分抓取,直接定位所有包含字段-值的独立行容器(每个字段对都包裹在一个.row标签里),这样不管字段在第几列,都能统一处理。
具体实现步骤
- 第一步:获取所有字段行容器
用CSS选择器直接抓取顶层容器下的所有子.row(排除包含列的父row,只抓最内层的字段行):spec_rows = response.css(".single-product__left-desc__specification .row .row") - 第二步:遍历每行提取字段和值
对每个行容器,分别提取字段名和对应的值,处理空白字符:spec_dict = {} for row in spec_rows: # 提取字段名,去除前后空白 field_name = row.css("strong::text").get(default="").strip() if not field_name: continue # 提取值,处理嵌套div的情况,合并文本并去空白 field_value = " ".join(row.css("div:not(:has(strong))::text").getall()).strip() spec_dict[field_name] = field_value - 第三步:映射到Scrapy Item字段
将字典里的字段名转为Snake_case(比如"Body Type"→"body_type"),赋值给Item:from your_project.items import YourItem item = YourItem() # 字段映射,可根据需求扩展 field_mapping = { "Body Type": "body_type", "Make": "make", "Transmission": "transmission", "Mileage": "mileage", # 其他字段继续添加 } for original_field, item_field in field_mapping.items(): item[item_field] = spec_dict.get(original_field, "") yield item
关键细节说明
- 用
:not(:has(strong))选择器避免误抓字段名所在的div,确保只取值的文本 - 用
getall()+join()处理值嵌套在子div的情况(比如Mileage字段) - 字段映射表可以统一管理所有需要抓取的字段,即使字段位置变化也不用修改核心抓取逻辑
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

