使用BeautifulSoup无法获取span标签文本,出现AttributeError报错如何解决?
报错原因
- 你通过
find_all("tr")获取到的所有行标签中,部分<tr>标签内部不存在class为secondaryInfo的span标签,find方法找不到对应元素时会返回None,此时强行调用.text属性就会触发AttributeError。 - 额外影响因素:IMDB的榜单页面部分内容为动态渲染生成,你使用
HTMLSession发起请求后没有执行JS渲染逻辑,部分动态标签未加载完成,也会提升获取到None的概率。
解决方法
先执行页面JS渲染、调整解析源,同时增加非空判断即可,修正后的代码如下:
from bs4 import BeautifulSoup from requests_html import HTMLSession session = HTMLSession() response = session.get("https://www.imdb.com/chart/boxoffice/?ref_=nv_ch_cht") # 执行JS渲染,加载所有动态生成的页面元素 response.html.render() # 解析渲染完成后的完整HTML内容 soup = BeautifulSoup(response.html.html, 'html.parser') # 精准定位包含电影信息的行标签,避免遍历到无目标内容的表头/空行 movie_rows = soup.select("tr.ipc-metadata-list-summary-item__c") for row in movie_rows: movie_name = row.find("span", class_ = "secondaryInfo") # 非空判断后再调用text属性 if movie_name: print(movie_name.text.strip())
核心调整点:
- 新增
response.html.render()执行页面JS渲染,确保动态内容全部加载完成 - 改用渲染后的
response.html.html作为解析源,而非未渲染的原始response.content - 使用更精准的选择器定位包含目标内容的行,减少无效遍历
- 取文本前增加非空判断,规避属性不存在的报错
内容的提问来源于stack exchange,提问作者Harbouli
相关产品推荐
相关产品推荐

