使用BeautifulSoup的find_all()爬取Indeed职位页面返回空列表的问题求助
使用BeautifulSoup的find_all()爬取Indeed职位页面返回空列表的问题求助
嘿,我之前爬Indeed的时候也碰到过一模一样的问题,咱们一步步来排查和解决:
首先,先确认核心问题:你看到的源码和requests拿到的内容可能不一样!
浏览器里的“查看页面源码”其实是JS渲染完成后的完整页面,但requests.get()只能获取服务器初始返回的静态HTML——Indeed很多职位卡片是通过JavaScript动态加载的,所以你在浏览器里看到的那些cardOutline tapItem fs-unmask result类的div,很可能根本不在page.content里。
你可以先做个简单验证:把page.content写入一个本地HTML文件,打开看看有没有职位卡片:
with open("indeed_page.html", "w", encoding="utf-8") as f: f.write(page.text)
打开这个文件,如果看不到职位,那就是动态加载的问题了。
解决办法分两种情况:
情况1:静态HTML里其实有元素,只是class匹配有问题
有时候Indeed的class名可能有细微变化,或者你复制的class组合不对。试试以下几种匹配方式:
- 只匹配最稳定的单个类(比如
tapItem或者result):
results = soup.find_all('div', class_="tapItem")
- 使用正则表达式匹配部分类名:
import re results = soup.find_all('div', class_=re.compile(r'tapItem'))
情况2:确实是动态加载导致的
这时候requests+BeautifulSoup就不够用了,需要用能渲染JS的工具,比如Selenium:
- 先安装Selenium:
pip install selenium,然后下载对应浏览器的驱动(比如ChromeDriver) - 示例代码:
from selenium import webdriver from bs4 import BeautifulSoup url = "https://nl.indeed.com/jobs?q=python+developer&l=Amsterdam&vjk=b073fb1938c41557" driver = webdriver.Chrome() # 确保驱动路径正确 driver.get(url) soup = BeautifulSoup(driver.page_source, 'html.parser') results = soup.find_all('div', class_="cardOutline tapItem fs-unmask result") print(results) driver.quit()
额外小技巧:添加请求头模拟浏览器
有时候Indeed会拦截无请求头的爬虫,给requests.get()加上User-Agent试试:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers)
先试试这些方法,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者mustapha imam
相关产品推荐
相关产品推荐

