BeautifulSoup find_all失效,如何提取window._STORE_DATA中目标职位数据?
为什么find_all会失效
BeautifulSoup是用来解析静态HTML源码的,而你爬的这个网站没有把职位数据直接写在HTML里,而是通过JavaScript动态渲染页面。所有招聘信息都存在window._STORE_DATA这个JS变量里,页面加载完成后,JS才会把这些JSON数据转换成你看到的职位列表元素。你用requests拿到的静态HTML里根本没有这些职位的文本内容,所以不管怎么用find_all搜关键词,都找不到结果。
提取JSON中目标职位的方法
直接从页面源码里提取window._STORE_DATA的内容,转成JSON后筛选目标职位,步骤如下:
- 获取页面源码:用requests库请求目标网页,拿到完整的页面文本
- 匹配JS变量里的JSON:用正则表达式定位
window._STORE_DATA =后面的JSON字符串 - 解析JSON数据:把匹配到的字符串转成Python字典,方便遍历
- 筛选目标职位:遍历字典里的职位数据,匹配标题包含
clinical lab scientist的条目
代码示例
import requests import re import json # 替换成目标招聘页面的URL url = "https://your-target-url-here" # 模拟浏览器请求,避免被反爬拦截 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' } response = requests.get(url, headers=headers) response.encoding = 'utf-8' # 用正则匹配window._STORE_DATA后的JSON内容,re.DOTALL允许匹配跨多行的内容 pattern = re.compile(r'window._STORE_DATA = (.*?);', re.DOTALL) match_result = pattern.search(response.text) if match_result: # 把字符串转成JSON对象 job_data = json.loads(match_result.group(1)) # 定位职位列表的位置(需要根据实际JSON结构调整键名,比如可能是job_data['jobs']) # 可以先打印job_data的结构,确认职位数据所在的键:print(json.dumps(job_data, indent=2)) jobs = job_data.get('jobs', []) # 筛选目标职位(大小写不敏感) target_jobs = [] for job in jobs: job_title = job.get('title', '').lower() if 'clinical lab scientist' in job_title: target_jobs.append({ 'title': job['title'], 'link': job.get('url', ''), 'location': job.get('location', '') }) # 输出筛选结果 if target_jobs: for idx, job in enumerate(target_jobs, 1): print(f"职位{idx}:") print(f"标题: {job['title']}") print(f"链接: {job['link']}") print(f"地点: {job['location']}\n") else: print("未找到匹配的clinical lab scientist职位") else: print("未找到window._STORE_DATA变量")
注意事项
- 要根据实际的JSON结构调整键名:比如职位列表可能在
job_data['positions']或者其他键下,你可以先打印job_data的完整结构(print(json.dumps(job_data, indent=2))),找到职位数据的具体位置 - 如果网站有反爬机制,可能需要在请求头里添加更多字段(比如
Referer),或者设置请求间隔 - 正则表达式的
re.DOTALL参数是为了匹配跨多行的JSON内容,避免因为换行导致匹配失败
内容的提问来源于stack exchange,提问作者Baby Yoda
相关产品推荐
相关产品推荐

