BeautifulSoup提取嵌套标签文本报错,求类同成功方案的解决办法
解决方案
你遇到的NoneType报错,是因为部分<h5>标签里可能没有span.price元素,直接调用find_next_sibling()会触发报错;同时原代码get_names函数存在缩进错误,if name语句在循环外,只会处理最后一个元素的结果。
核心修复点
- 先判断
span.price是否存在,再执行后续操作,避免NoneType报错 - 使用
find_next_sibling(text=True)获取span后的纯文本,并用strip()清理空白字符 - 修正函数内的缩进问题,确保每个元素都被正确遍历处理
修正后的完整代码
from requests import get from bs4 import BeautifulSoup # 补充你的请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } def get_basic_info(content_list): basic_info = [] for item in content_list: # 用extend代替append,避免生成嵌套列表,简化后续遍历 basic_info.extend(item.find_all('h5')) return basic_info def get_names(basic_info): names = [] for i in basic_info: price_span = i.find("span", attrs={"class": "price"}) # 先判断价格标签是否存在 if price_span: # 获取span后的纯文本节点 name_text = price_span.find_next_sibling(text=True) if name_text: # 清理文本前后的空白字符,过滤空内容 cleaned_name = name_text.strip() if cleaned_name: names.append(cleaned_name) return names all_names = [] for page in range(1, 18): # 用f-string拼接URL,更简洁易读 base_url = f"https://www.easycar.tw/carList.php?Action=search&show=col&lifting=desc&year=&year1=&page={page}" response = get(base_url, headers=headers) html_soup = BeautifulSoup(response.text, 'html.parser') content_list = html_soup.find_all('div', attrs={'class': 'caption'}) basic_info = get_basic_info(content_list) page_names = get_names(basic_info) # 累加每页的结果,避免被覆盖 all_names.extend(page_names) # 输出提取到的车型名称 print(all_names)
额外优化说明
- 重构
get_basic_info的返回结构,避免嵌套列表,减少后续遍历的复杂度 - 使用f-string替代字符串拼接,提升代码可读性和维护性
- 增加多层空值判断,确保代码在页面结构异常时也能稳定运行
- 单独维护全局结果列表,避免每次循环覆盖之前提取的内容
内容的提问来源于stack exchange,提问作者Renee
相关产品推荐
相关产品推荐

