You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动