如何基于URL获取网页转为BeautifulSoup对象并提取二手车信息
爬虫后续步骤指导:从已保存的HTML提取车辆信息
一、遍历已保存的HTML文件并转为BeautifulSoup对象
你之前的代码仅处理了最后一个页面的HTML,需要循环遍历所有已保存的example{i}.html文件,逐个读取并转为BeautifulSoup对象。
二、提取目标字段
针对每个页面的BeautifulSoup对象,定位车辆列表节点,逐个提取所需信息:
- 价格:从
p.price节点提取文本 - 车辆详情页URL:从车辆标题的父级a标签提取
href,拼接域名得到完整URL - 生产年份、引擎参数:从车辆副标题(如
p.car-model)拆分文本提取 - 经销商信息:定位页面中经销商相关节点(如
div.dealer-info)提取文本,无信息时标注默认值
完整代码示例
from bs4 import BeautifulSoup import os import json # 存储所有提取的车辆信息 car_data = [] # 遍历1到49页的HTML文件 for i in range(1, 50): file_path = f"example{i}.html" # 检查文件是否存在,避免因网络问题导致的文件缺失报错 if not os.path.exists(file_path): print(f"文件 {file_path} 不存在,跳过") continue # 读取HTML文件并转为BeautifulSoup对象 with open(file_path, "r", encoding="utf-8") as fp: webpage = fp.read() soup = BeautifulSoup(webpage, "html.parser") # 定位所有车辆列表节点(修正原代码findall拼写错误为find_all) car_listings = soup.find_all('div', class_="col-lg-4 col-md-12 car-listing") # 遍历每个车辆节点提取信息 for listing in car_listings: # 提取价格 price_tag = listing.find('p', class_="price") price = price_tag.text.strip() if price_tag else "无价格信息" # 提取详情页URL(拼接域名补全相对路径) title_link = listing.find('h6', class_="car-make").find_parent("a") detail_href = title_link.get("href") if title_link else "" detail_url = f"https://jammer.ie{detail_href}" if detail_href else "无详情链接" # 提取生产年份和引擎参数(按页面文本格式拆分) model_tag = listing.find('p', class_="car-model") model_text = model_tag.text.strip() if model_tag else "" year, engine = "无法提取年份", "无法提取引擎参数" if "|" in model_text: parts = model_text.split("|") year = parts[0].strip() engine = parts[1].strip() # 提取经销商信息(根据页面实际结构调整节点类名) dealer_tag = listing.find('div', class_="dealer-info") dealer_info = dealer_tag.text.strip() if dealer_tag else "无经销商信息" # 将单条车辆信息存入列表 car_data.append({ "年份": year, "引擎参数": engine, "价格": price, "经销商信息": dealer_info, "详情页URL": detail_url }) # 将提取的数据保存为JSON文件,方便后续查看和分析 with open("车辆信息.json", "w", encoding="utf-8") as f: json.dump(car_data, f, ensure_ascii=False, indent=4) print(f"共提取 {len(car_data)} 条车辆信息,已保存到车辆信息.json")
代码说明
- 文件遍历:通过
range(1,50)循环处理所有已保存的HTML文件,加入文件存在检查避免报错; - 节点定位修正:原代码
findall为拼写错误,改为find_all;直接定位车辆列表节点,简化嵌套循环逻辑; - 字段提取细节:
- 详情页URL需拼接域名,因为页面内
href为相对路径; - 年份和引擎参数通过拆分副标题文本提取,若页面格式变化需调整拆分逻辑;
- 所有提取步骤加入空值判断,避免因节点缺失导致代码崩溃;
- 详情页URL需拼接域名,因为页面内
- 数据保存:最终将信息保存为JSON格式,便于后续解析和使用。
内容的提问来源于stack exchange,提问作者user14820169
相关产品推荐
相关产品推荐

