如何使用BeautifulSoup提取window.initialState中的title与longURL字段
Python爬虫提取window.initialState并转JSON的解决方案
匹配失败的核心原因
- 正则中
.默认不匹配换行符,若window.initialState的赋值内容跨行会导致匹配不全 - 未移除匹配结果中的
window.initialState =前缀,不符合JSON格式要求 - 示例中可见的多余括号、尾部分号、引号等干扰字符未清理,也会导致JSON解析失败
完整实现代码
import re import json import requests from bs4 import BeautifulSoup as bsoup # 目标地址 url = "替换为你的抓取网址" # 加UA头避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } page = requests.get(url, headers=headers) soup = bsoup(page.text, 'html.parser') # 筛选包含window.initialState的script标签 target_script = "" for script in soup.find_all('script'): if script.string and "window.initialState" in script.string: target_script = script.string break if target_script: # 正则加re.DOTALL标记让.匹配换行,捕获JSON本体 match_result = re.search(r'window\.initialState\s*=\s*({.*?});?', target_script, re.DOTALL) if match_result: # 提取JSON字符串并清理干扰字符 raw_json = match_result.group(1).strip().strip("('").strip("')") try: data = json.loads(raw_json) # 读取目标字段 title = data.get("title") long_url = data.get("longURL") print(f"Title: {title}, longURL: {long_url}") except json.JSONDecodeError as e: print(f"JSON解析出错:{e}") # 出错时打印raw_json排查特殊字符、转义问题 # print(raw_json)
注意事项
- 若页面为重度JS动态渲染,requests无法获取到完整源码时,可替换为selenium、playwright等浏览器自动化工具加载页面后再提取源码
- 若仍出现JSON解析失败,可打印
raw_json检查是否存在未转义的特殊字符、单引号包裹等问题,针对性做字符串替换清理即可
内容的提问来源于stack exchange,提问作者Thanakid Trakoolsilp
相关产品推荐
相关产品推荐

