如何用Python的Beautiful Soup从HTML提取指定JavaScript变量?
提取HTML中JavaScript变量的实用方案
既然你日常用BeautifulSoup做爬取,那咱们可以结合正则表达式轻松搞定这些JS变量的提取,步骤非常清晰:
1. 解析HTML并定位目标script标签
先把你通过GET请求拿到的HTML内容用BeautifulSoup解析,然后精准定位包含目标变量的<script>标签。因为这个script里有明确的变量名(比如accessToken),咱们可以用正则匹配文本的方式来定位,比单纯匹配type="text/javascript"更精准,避免抓到无关的script标签:
from bs4 import BeautifulSoup import re # 假设你已经通过GET请求获取到了html_content soup = BeautifulSoup(html_content, 'html.parser') # 找到包含目标变量的script标签 target_script = soup.find('script', text=re.compile(r'accessToken|ivString|encryptedFpAccountId'))
2. 提取script标签内的文本内容
拿到目标script标签后,提取里面的纯文本内容:
script_text = target_script.string if target_script else ''
3. 用正则匹配变量值
这里有两种方式可以提取,按需选择:
方式一:逐个提取单个变量
如果只需要特定几个变量,可以针对性写正则匹配:
# 提取accessToken access_token_match = re.search(r'var accessToken = "(.*?)";', script_text) access_token = access_token_match.group(1) if access_token_match else None # 提取ivString iv_string_match = re.search(r'var ivString = "(.*?)";', script_text) iv_string = iv_string_match.group(1) if iv_string_match else None # 提取encryptedFpAccountId encrypted_fp_id_match = re.search(r'var encryptedFpAccountId = "(.*?)";', script_text) encrypted_fp_id = encrypted_fp_id_match.group(1) if encrypted_fp_id_match else None
方式二:一次性提取所有符合格式的变量
如果想更灵活,一次性把所有var 变量名 = "值";格式的变量都提取出来存成字典,后续直接通过键名取值:
var_pattern = re.compile(r'var (\w+) = "(.*?)";') var_dict = dict(var_pattern.findall(script_text)) # 直接通过键名获取对应值 access_token = var_dict.get('accessToken') iv_string = var_dict.get('ivString') encrypted_fp_id = var_dict.get('encryptedFpAccountId')
小提醒
- 记得处理匹配失败的情况(比如找不到script标签或者变量不存在),用
if ... else None可以避免程序报错崩溃。 - 如果后续遇到变量值里有转义字符(比如
\"),可以稍微调整正则或者对提取到的值做转义处理,不过从你给出的示例来看,当前正则完全够用。
内容的提问来源于stack exchange,提问作者Joe Cranney




