You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后筛选目标职位,步骤如下:

  1. 获取页面源码:用requests库请求目标网页,拿到完整的页面文本
  2. 匹配JS变量里的JSON:用正则表达式定位window._STORE_DATA = 后面的JSON字符串
  3. 解析JSON数据:把匹配到的字符串转成Python字典,方便遍历
  4. 筛选目标职位:遍历字典里的职位数据,匹配标题包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:05:22