使用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拿到的原始响应里根本不存在这个元素。
修复方案
- 修正参数错误,把
id_改为id - 补充请求头模拟真实浏览器访问,避免被反爬拦截
- 调整遍历逻辑,找到元素后立即输出/存储,避免被覆盖
- 如果确认是动态渲染内容,换用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
相关产品推荐
相关产品推荐

