
本文教你使用正则表达式从beautiful soup抓取的车型字符串中可靠提取四位年份(如“2011”),并结合实际车源数据完成条件筛选,适合初学者快速上手。
本文教你使用正则表达式从beautiful soup抓取的车型字符串中可靠提取四位年份(如“2011”),并结合实际车源数据完成条件筛选,适合初学者快速上手。
在构建汽车数据爬虫时,常需从混合文本(如 "2011 Highlander" 或 "2022 Toyota Corolla LE")中精准定位年份信息。直接用 .startswith("2011") 或 in 判断容易出错——因为年份可能位于字符串开头、中间,或混杂空格/标点;而 Beautiful Soup 的 string 参数无法直接匹配子串模式。此时,正则表达式(regex)是最稳健的选择。
Python 的 re 模块提供了高效提取能力。四位年份具有明确规律:连续4个数字,且通常独立成词(前后为空格或标点)。推荐使用 r"\b\d{4}\b"(\b 表示单词边界),比简单 r"\d{4}" 更安全,可避免误匹配长数字中的子串(如 "123456" 中的 "1234")。
以下是整合到你原有代码中的完整实践方案:
import requests
import re
from bs4 import BeautifulSoup
url = "https://www.carsdirect.com/used_cars/listings/toyota"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="mainWrapper")
job_elements = results.find_all("div", class_="infoCell")
# 遍历每条车源记录
for job_element in job_elements:
model_element = job_element.find("p", class_="ymmListRowTitle")
ymm_element = job_element.find("p", class_="ymmListRowTrim")
# 合并标题与型号字段(更全面覆盖年份)
full_text = f"{model_element.text.strip()} {ymm_element.text.strip()}"
# 使用正则提取年份(首位匹配即可)
year_match = re.search(r"\b\d{4}\b", full_text)
year = year_match.group(0) if year_match else None
# 筛选 2011 年款 Highlander(不区分大小写)
if year == "2011" and "highlander" in full_text.lower():
miles_element = job_element.find("div", class_="mileLine")
price_element = job_element.find("div", class_="priceLine")
contact_element = job_element.find("div", class_="contactBlock")
print(f"✅ 匹配成功:{full_text.strip()}")
print(f" 里程:{miles_element.text.strip() if miles_element else 'N/A'}")
print(f" 价格:{price_element.text.strip() if price_element else 'N/A'}")
print(f" 联系:{contact_element.text.strip() if contact_element else 'N/A'}\n")⚠️ 关键注意事项:
- 始终检查匹配结果:re.search() 返回 None 时直接调用 .group() 会报错,务必先判空;
- 优先用 re.search() 而非 re.findall():年份通常只需首个(如 "2011 Highlander Hybrid"),search() 效率更高;
- 注意网页结构稳定性:class_="ymmListRowTitle" 等类名可能随网站改版失效,建议添加异常处理(如 try/except)提升鲁棒性;
- 遵守 robots.txt 与请求频率:carsdirect.com 明确禁止爬虫,本例仅作教学演示,请务必查阅其使用条款并在生产环境添加延迟(time.sleep(1))及 User-Agent 头部。
总结:年份提取不是字符串查找,而是模式识别任务。掌握 re.search(r"\b\d{4}\b", text) 这一核心模式,你就能在各类车型文本中稳定定位年份,并以此驱动后续过滤、分类与结构化存储——这是构建专业级汽车数据管道的第一步。










