Beautiful Soup爬取遇NoneType错误及批量提取ID问题求助
问题解决与实现方案
一、TypeError错误原因与修复
- 错误根源:
find()方法找不到目标元素时会返回None,此时尝试用["value"]访问属性就会触发'NoneType' object is not subscriptable错误。 - 修复方法:每次调用
find()后先判断是否找到元素,再访问属性;或者用get()方法安全获取属性值。
二、提取hidden_title1到hidden_title450的元素值
不需要循环遍历数字逐个查找,直接用正则表达式匹配ID,一次性筛选符合规则的input元素,更高效且避免遗漏。
修正后的完整代码
import re from bs4 import BeautifulSoup # 假设你已获取网页内容并解析为soup对象 # soup = BeautifulSoup(html_content, 'html.parser') Result_1 = soup.find("div", class_="row search-results d-flex flex-column tablescraper-selected-table") # 先判断容器是否存在,避免后续报错 if Result_1: storeListings = Result_1.find_all("div", class_="item-deets d-flex flex-column") dataset_ = [] # 列表初始化移到循环外,避免每次清空数据 for store in storeListings: # 正则匹配id为hidden_title+1到450的input元素 title_inputs = store.find_all("input", id=re.compile(r'^hidden_title([1-9]|[1-9]\d|1\d{2}|[1-3]\d{2}|4[0-4]\d|450)$')) for input_tag in title_inputs: # 用get()安全获取value,无属性时返回None name = input_tag.get('value') if name: dataset_.append(name) print(name) else: print("未找到目标容器div")
代码说明
- 正则规则解释:
^hidden_title([1-9]|[1-9]\d|1\d{2}|[1-3]\d{2}|4[0-4]\d|450)$精准匹配ID范围:^和$确保完全匹配ID,排除超出450或格式不符的元素- 括号内规则覆盖1到450的所有数字
- 安全属性访问:
input_tag.get('value')替代input_tag["value"],避免因元素无value属性报错 - 容器存在判断:先检查
Result_1是否存在,防止后续find_all()触发错误 - 数据存储优化:
dataset_初始化移到循环外,避免每次循环清空已收集的内容
三、原代码的其他问题
dataset_ = []放在内层循环,每次循环都会清空列表,无法保存数据- 循环
range(1,301)只能遍历到300,无法覆盖到450,且逐个查找效率低,还会因不存在的ID返回None触发错误
内容的提问来源于stack exchange,提问作者jwo jiunn Kon
相关产品推荐
相关产品推荐

