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

使用BeautifulSoup抓取指定ID元素返回None如何解决

BeautifulSoup定位指定ID元素返回None问题排查

相关问题代码如下:

from bs4 import BeautifulSoup
import requests

url= "Website"
page= requests.get(url)

soup = BeautifulSoup(page.content, 'html.parser')
lists = soup.find_all ('div', class_="position-relative")

for list in lists:
    Value = list.find('h5', id_= "player_value")
print (Value)

目标网页元素参考:
浏览器开发者工具元素结构截图

问题原因

返回None由以下一个或多个问题导致:

  • 属性匹配参数写错:BeautifulSoup仅在匹配class属性时需要使用带下划线的class_参数(因为class是Python内置保留关键字,不能直接作为参数名),匹配id属性直接使用id参数即可。代码中写的id_="player_value"是无效参数,不会触发id属性匹配逻辑,自然找不到对应标签。
  • 打印逻辑存在漏洞:print(Value)写在for循环外部,循环遍历所有div时,只要某一个div下不存在目标h5标签,Value就会被赋值为None,最终输出的只是最后一次循环的结果,即使之前的循环已经匹配到目标元素,也会被后续的None覆盖。
  • 请求被反爬策略拦截:requests默认的请求头会标识自身为爬虫程序,多数站点会对这类请求返回验证页、空白页等异常响应,不会返回包含目标数据的正常页面内容。
  • 目标数据为动态渲染:浏览器开发者工具Elements面板展示的是经过JS执行渲染后的完整DOM结构,而requests只能获取服务器返回的初始静态HTML,无法执行JS。如果目标h5标签是页面加载后通过JS异步请求注入的,requests拿到的原始响应里根本不存在这个元素。

修复方案

  1. 修正参数错误,把id_改为id
  2. 补充请求头模拟真实浏览器访问,避免被反爬拦截
  3. 调整遍历逻辑,找到元素后立即输出/存储,避免被覆盖
  4. 如果确认是动态渲染内容,换用Selenium、Playwright等可执行JS的抓取工具,或直接定位数据接口请求

修正后的参考代码:

from bs4 import BeautifulSoup
import requests

url= "替换为你的目标站点地址"
# 补充请求头模拟Chrome浏览器访问
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
page= requests.get(url, headers=headers)
# 调试时可打开下方注释,确认返回内容是否为正常页面,搜索是否存在player_value关键字
# print(page.text)

soup = BeautifulSoup(page.content, 'html.parser')
lists = soup.find_all('div', class_="position-relative")

for item in lists:
    value = item.find('h5', id="player_value")
    # 找到元素才输出,避免打印None
    if value:
        print(value.text.strip())

内容的提问来源于stack exchange,提问作者Cole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:01:04