Python BeautifulSoup爬取LinkedIn职位时find_all属性报错如何解决?
问题原因
你遇到的AttributeError: 'NoneType' object has no attribute 'find_all'报错,是因为soup.find()没有匹配到对应class的元素,返回了空值,核心原因有两个:
- 直接用requests发起无标识的GET请求会被LinkedIn识别为爬虫,返回的页面不是浏览器中看到的正常职位列表页,自然不存在你写的类对应的元素
- 浏览器开发者工具中看到的带
ember-view后缀的类是前端JS渲染后动态生成的,requests请求拿到的静态HTML里没有这类动态类,匹配不到属于正常情况
解决方案
- 先添加
User-Agent请求头伪装成浏览器请求,确保拿到正常的职位列表静态内容 - 用静态页面实际存在的类进行元素定位,公开职位列表的职位卡片统一使用
base-search-card类,不需要调用动态生成的ember相关类
修改后可正常运行的代码如下:
import requests from bs4 import BeautifulSoup # 伪装成Chrome浏览器请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } url = "https://www.linkedin.com/jobs/search/?geoId=101282230&keywords=it%20business%20analyst&location=Germany" response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 定位所有职位卡片,用静态存在的类 job_cards = soup.find_all('div', class_='base-search-card') for card in job_cards: # 职位名称 job_title = card.find('h3', class_='base-search-card__title').get_text(strip=True) # 公司名称 job_company = card.find('h4', class_='base-search-card__subtitle').get_text(strip=True) # 所在地 job_location = card.find('span', class_='job-search-card__location').get_text(strip=True) # 职位链接 job_link = card.find('a', class_='base-card__full-link')['href'] # 打印结果 print(f"职位名称:{job_title}") print(f"公司名称:{job_company}") print(f"所在地:{job_location}") print(f"职位链接:{job_link}") print("-"*50)
注意事项
- 该代码只能拿到未登录状态下LinkedIn公开的前25条职位,要获取更多数据需要携带登录Cookie,或者使用官方提供的LinkedIn Jobs API
- 频繁请求会触发LinkedIn的反爬机制,建议添加请求间隔,避免IP被限制
内容的提问来源于stack exchange,提问作者Prashanta Guha
相关产品推荐
相关产品推荐

