使用BeautifulSoup获取HTML元素属性时find返回None该如何解决?
问题成因
- URL拼接错误:你的代码里
sitename = 'https://www.marketwatch.com/investing/stock/tsla' + stock_name,调用时传入的参数是tsla,最终拼接出的URL是https://www.marketwatch.com/investing/stock/tslatsla,属于无效地址,即使返回状态码200也是站点跳转后的通用页面,不存在你要的目标元素。 - 元素查找条件不合理:你硬编码了
channel属性的固定值作为查找条件,该属性值是不同股票对应的动态ID,会随股票代码变化,即使URL正确也匹配不到对应元素。 - 缺少非空校验:没有对
find方法的返回结果做判断,当元素不存在返回None时,直接对None做下标取值操作就会触发你遇到的TypeError。
解决方案
按以下步骤修改即可:
- 修复URL拼接逻辑,删除路径中硬编码的
tsla,使用参数动态拼接路径:
sitename = f'https://www.marketwatch.com/investing/stock/{stock_name}'
- 更换更稳定的元素查找条件,使用固定的
field属性代替动态的channel属性:
price_holder = soup.find("bg-quote", {"field": "Last"})
- 增加非空校验避免报错:
if price_holder: price = price_holder["data-last-raw"] print(price) else: print("未找到目标价格元素")
- 若修改后依然找不到元素,说明目标元素是前端JavaScript动态渲染生成的,
requests只能获取静态HTML源码,无法拿到动态渲染的内容,可改用Selenium、Playwright等支持浏览器渲染的工具爬取,或直接查找页面内嵌的JSON数据、对应数据接口提取价格。
内容的提问来源于stack exchange,提问作者Aatu Tahkola
相关产品推荐
相关产品推荐

