Web Scraping项目中BeautifulSoup的find()函数无法生效问题求助
问题原因排查及修复方案
核心错误点
- 拼写错误:
find_all参数写的herf=True是错误拼写,正确应为href,且li标签本身不存在href属性,加这个过滤条件会直接导致找不到任何匹配元素,循环根本不会执行。
- 拼写错误:
- 动态页面爬取逻辑错误:目标站点
bama.ir的车辆列表是JavaScript动态渲染生成的,直接用requests发起请求拿到的静态HTML里不包含你要抓取的列表数据,所以即使修正拼写也找不到对应节点。你虽然导入了selenium但全程没有调用,没有用到动态页面渲染能力。
- 动态页面爬取逻辑错误:目标站点
- 缺少非空判断:即使能匹配到元素,也存在部分节点没有对应字段的可能,直接调用
.text会抛出AttributeError异常。
- 缺少非空判断:即使能匹配到元素,也存在部分节点没有对应字段的可能,直接调用
修复后可运行代码
# 导入依赖 from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import pandas as pd import time # 用selenium启动浏览器加载动态页面 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get('https://bama.ir/car') # 等待页面渲染完成,可根据网络情况调整等待时长 time.sleep(3) products= [] prices = [] kilometrs = [] # 用selenium拿到渲染后的完整页面源码 soup = BeautifulSoup(driver.page_source, 'html.parser') # 去掉错误的herf参数,只按class匹配li标签 for a in soup.find_all('li', attrs={'class':'car-list-item-li list-data-main'}): # 新增非空判断,避免属性报错 name = a.find('div', attrs={'class':'title'}) price = a.find('p', attrs={'class':'cost single-price'}) kilometr = a.find('div', attrs={'class':'car-func-details'}) if name and price and kilometr: products.append(name.text.strip()) prices.append(price.text.strip()) kilometrs.append(kilometr.text.strip()) driver.quit() df = pd.DataFrame({'Product Name':products,'Price':prices,'kilometr':kilometrs}) df.to_csv('products.csv', index=False, encoding='utf-8-sig')
额外优化说明
- 输出csv用
utf-8-sig编码,避免Windows下打开csv出现乱码问题 - 增加了浏览器资源自动释放逻辑,爬取完成后自动关闭浏览器进程
- 对抓取到的文本做了
strip()处理,去除多余的换行和空白字符
内容的提问来源于stack exchange,提问作者amirreza es
相关产品推荐
相关产品推荐

