爬取IMDB榜单调用BeautifulSoup时出现str无find_all属性报错
IMDB爬虫报错排查与修复
问题现象
爬取IMDB Top250榜单页面时运行代码抛出str object has no attribute find_all错误,报错截图如下:
原实现代码:
import requests as r from bs4 import BeautifulSoup as bs source= r.get('https://www.imdb.com/chart/top/') soup=bs(source.text,'html.parser') movies= bs.find('tbody', class_="lister-list") print(movies)
代码中未主动调用find_all方法,但运行时触发该属性不存在的报错。
问题根源
- 核心错误是BeautifulSoup类与实例的调用逻辑混淆:你将导入的
BeautifulSoup类设置别名为bs,执行soup=bs(source.text,'html.parser')后,soup才是存储了解析后页面DOM结构的实例对象。但查找元素时你写的是bs.find(),属于直接在BeautifulSoup类上调用实例方法,方法内部绑定的self参数实际接收到的是你传入的第一个参数'tbody'字符串,后续BeautifulSoup内部逻辑自动调用find_all时,相当于在字符串对象上执行方法,因此抛出对应报错,和你有没有主动编写find_all调用代码无关。 - 额外隐藏问题:IMDB配置了基础反爬规则,直接发起无身份标识的requests请求会被拦截返回403状态码,就算修正调用逻辑,也拿不到正常的榜单页面DOM结构。
修复方案
- 修正元素查找的调用主体,将
bs.find()改为soup.find(),使用解析完成的页面对应实例执行查找操作 - 给请求添加合法的
User-Agent请求头,模拟正常浏览器访问绕过基础反爬,同时增加请求状态校验,避免请求失败后执行无意义的解析逻辑
修复后可正常运行的代码:
import requests as r from bs4 import BeautifulSoup as bs # 配置请求头模拟浏览器访问 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" } source = r.get('https://www.imdb.com/chart/top/', headers=headers) # 校验请求是否成功,失败直接抛出异常 source.raise_for_status() soup = bs(source.text, 'html.parser') # 用解析完成的soup实例查找元素 movies = soup.find('tbody', class_="lister-list") print(movies)
内容的提问来源于stack exchange,提问作者Irshad Khan
相关产品推荐
相关产品推荐

