Python网页爬虫如何在条件不满足时返回nan/nil等缺省值
爬虫页面结构变化容错实现方案
你遇到的报错是IndexError: list index out of range,翻译为索引错误:列表下标超出范围,触发原因是页面结构变化后,class为value的div元素数量不足4个,直接通过[i]索引不存在的元素就会导致程序中断。
原代码还存在以下可优化问题:
- 循环逻辑冗余:while + for嵌套会重复遍历链接,存在重复采集的问题
- 变量名拼写错误:每次采集结束后重置的是
rating,实际存储数据的列表是ratings,会导致旧数据堆积 - 未处理网络请求异常、元素不存在等其他可能导致中断的场景
修改后可容错的代码
import requests from bs4 import BeautifulSoup import numpy as np # 用到nan需要导入numpy,也可以直接用None代替 def get_quality_rating_info(links): # 可选添加请求头模拟浏览器,降低反爬拦截概率 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } Quality_rating = [] for link in links: print(f"Progress: Size of data collected {len(Quality_rating)}... {len(Quality_rating)}/{len(links)}") ratings = [] try: # 捕获请求阶段异常 product_url = requests.get(link, headers=headers, timeout=10) product_url.raise_for_status() # 自动触发4xx/5xx状态码异常 new_soup = BeautifulSoup(product_url.text, "html.parser") value_divs = new_soup.findAll("div", {"class":"value"}) # 先判断元素数量是否足够,避免索引越界 if len(value_divs) >=4: for i in range(4): quality = value_divs[i] ratings.append(str(quality.text.strip())) Quality_rating.append(ratings[0]) else: # 元素数量不足时插入nan Quality_rating.append(np.nan) except Exception as e: # 所有异常场景都插入nan,继续运行 Quality_rating.append(np.nan) print("Successfully collected Quality rating data!") return Quality_rating
优化效果说明
- 所有请求错误、页面结构不匹配、解析错误的场景都会自动返回
nan,不会中断采集流程 - 修复了原代码的循环逻辑和变量拼写问题,不会出现重复采集和数据堆积
- 不需要nan的话可以把
np.nan替换为None或者自定义的占位字符串比如"无数据"
内容的提问来源于stack exchange,提问作者Psalishol
相关产品推荐
相关产品推荐

