You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

代码说明

  1. 正则规则解释:^hidden_title([1-9]|[1-9]\d|1\d{2}|[1-3]\d{2}|4[0-4]\d|450)$ 精准匹配ID范围:
    • ^和$确保完全匹配ID,排除超出450或格式不符的元素
    • 括号内规则覆盖1到450的所有数字
  2. 安全属性访问:input_tag.get('value')替代input_tag["value"],避免因元素无value属性报错
  3. 容器存在判断:先检查Result_1是否存在,防止后续find_all()触发错误
  4. 数据存储优化:dataset_初始化移到循环外,避免每次循环清空已收集的内容

三、原代码的其他问题

  • dataset_ = []放在内层循环,每次循环都会清空列表,无法保存数据
  • 循环range(1,301)只能遍历到300,无法覆盖到450,且逐个查找效率低,还会因不存在的ID返回None触发错误

内容的提问来源于stack exchange,提问作者jwo jiunn Kon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:17:09