Python爬取Craigslist时嵌套列表遍历与格式输出问题排查
Craigslist商品条目爬取问题修复方案
故障根因
- 当前代码仅定义了价格、日期两个字段的提取函数,没有编写函数调用逻辑,也没有实现标题、距离两个字段的提取,更没有做单条商品的字段组装,运行后自然没有任何输出
- 之前出现的「仅单个字段返回全量数据、其余条目/字段缺失」问题,本质是提取逻辑的粒度错误:直接在全页面范围捞取所有同字段元素,没有以单条商品对应的父容器为单位提取数据,很容易出现字段错位、数据匹配不上的问题
正确实现思路
以单条商品的容器节点为最小提取单位,从根源避免字段错位:
- 第一步:定位页面所有
li.result-row节点,每个节点对应1条独立的Craigslist商品条目 - 第二步:遍历每个商品节点,在节点内部分别查找价格、发布日期、标题、距离四个目标字段
- 第三步:组装单条商品的结构化数据,逐行输出即可;如果需要存为列表/字典/元组等结构,在循环外初始化空容器,每次循环将单条数据写入即可
可运行修正代码
from requests_html import HTMLSession session = HTMLSession() url = "https://sandiego.craigslist.org/search/nsd/sss?query=computer" resp = session.get(url) # 获取所有商品条目节点 listing_nodes = resp.html.find("li.result-row") for node in listing_nodes: # 单条节点内提取字段,加空值判断避免部分条目缺字段时报错 price = node.find(".result-price", first=True).text if node.find(".result-price", first=True) else "无价格" pub_date = node.find(".result-date", first=True).text if node.find(".result-date", first=True) else "无发布日期" title = node.find(".result-title.hdrlnk", first=True).text if node.find(".result-title.hdrlnk", first=True) else "无标题" distance = node.find(".maptag", first=True).text if node.find(".maptag", first=True) else "无距离信息" # 逐行输出单条商品数据 print(f"价格:{price} | 发布日期:{pub_date} | 标题:{title} | 距离:{distance}")
代码中选择器做了简化,只要是在单条商品节点内查找元素,不需要写全量的长选择器路径,能大幅降低选择器写错的概率。如果需要导出数据,直接在循环内将单条字段组装为字典/元组追加到预设的列表中即可。
内容的提问来源于stack exchange,提问作者Anoduck - The Anonymous Duck
相关产品推荐
相关产品推荐

