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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:47:33