使用BeautifulSoup提取无类名span内文本,解决AttributeError报错问题
解决BeautifulSoup爬取墨西哥Indeed职位薪资的AttributeError问题
错误原因
该报错的核心触发逻辑是:并非所有职位卡片都公开了薪资数据,当card.find("div", {"class" : "salary-snippet"})找不到对应节点时会返回None,直接对None调用find()方法就会抛出属性不存在的错误。
解决方案
方案1:直接提取aria-label属性(更简便)
你给出的HTML结构中,薪资内容已经提前存放在salary-snippet节点的aria-label属性里,不需要再向下查找span节点,代码如下:
salary_snippet = card.find("div", class_="salary-snippet") salary = salary_snippet["aria-label"].strip() if salary_snippet else "无公开薪资"
方案2:逐层判断节点存在性
如果需要严格取span内的文本,可以逐层做非空判断,避免链式调用的报错:
salary = "无公开薪资" salary_snippet = card.find("div", class_="salary-snippet") if salary_snippet: salary_span = salary_snippet.find("span") if salary_span: salary = salary_span.text.strip()
方案3:用CSS选择器简化代码
通过select_one方法直接定位目标span,代码更简洁:
salary_ele = card.select_one("div.salary-snippet span") salary = salary_ele.text.strip() if salary_ele else "无公开薪资"
补充注意事项
如果所有带公开薪资的职位都匹配不到对应节点,请打印当前
card的HTML源码,确认你抓取到的页面结构和浏览器端查看的结构一致。Indeed存在反爬机制,部分动态加载的内容直接用requests无法获取,需要搭配Selenium、Playwright等无头浏览器工具抓取。
内容的提问来源于stack exchange,提问作者Benjamin Lopez
相关产品推荐
相关产品推荐

