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

如何用Selenium+BeautifulSoup4高效获取JavaScript配置参数?

结合Selenium与BeautifulSoup4提取JavaScript配置中input参数的高效方案

针对你需要提取页面中require.config.params['matchheader'].input数组的需求,这里提供两种高效实现方案,兼顾准确性和效率:

方案一:Selenium获取源码 + BeautifulSoup定位脚本 + 正则解析

这种方法适合需要同时处理页面其他HTML元素的场景,步骤清晰:

  1. 用Selenium加载页面并获取完整源码
  2. 用BeautifulSoup定位目标<script>标签
  3. 用正则匹配出input数组的内容,再转换为Python可识别的列表
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import re
import json

# 初始化Chrome浏览器(需提前配置对应驱动)
driver = webdriver.Chrome()
try:
    # 加载目标页面
    driver.get("https://www.whoscored.com/Matches/1640674/Show/Portugal-Liga-Portugal-2022-2023-Rio-Ave-Vizela")
    # 等待页面核心脚本加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, "script"))
    )
    # 获取页面完整源码
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, "html.parser")
    
    # 筛选包含目标配置的script标签
    target_script = None
    for script in soup.find_all("script", type="text/javascript"):
        if "require.config.params['matchheader']" in script.text:
            target_script = script.text
            break
    
    if target_script:
        # 正则匹配input数组的完整内容
        input_match = re.search(r'input:\s*(\[.*?\])', target_script, re.DOTALL)
        if input_match:
            input_str = input_match.group(1)
            # 处理JS数组中的空值(将,,替换为,null,避免JSON解析报错)
            input_str = input_str.replace(",,", ",null,").replace(",]", "]")
            # 转换为Python列表
            input_data = json.loads(input_str)
            print("提取到的input参数:", input_data)
finally:
    # 关闭浏览器
    driver.quit()

方案二:Selenium直接执行JavaScript提取(更高效准确)

这种方法跳过HTML解析和正则匹配,直接在浏览器上下文执行JS获取目标数据,是效率最高的方式——无需额外解析步骤,且能直接获取JS对象的真实值:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

# 初始化Chrome浏览器
driver = webdriver.Chrome()
try:
    driver.get("https://www.whoscored.com/Matches/1640674/Show/Portugal-Liga-Portugal-2022-2023-Rio-Ave-Vizela")
    # 等待目标JS对象加载完成
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return typeof require.config.params['matchheader'] !== 'undefined'")
    )
    # 直接执行JS获取input数组
    input_data = driver.execute_script("return require.config.params['matchheader'].input")
    # 处理JS数组中的undefined值(转为Python空字符串)
    input_data = [item if item is not None else "" for item in input_data]
    print("提取到的input参数:", input_data)
finally:
    driver.quit()

方案对比

  • 方案一适合需要同时处理页面其他HTML内容的场景,但正则解析需要适配不同JS格式,灵活性稍差
  • 方案二更高效、准确,直接利用浏览器JS引擎获取数据,无需字符串解析,是优先推荐的方案

内容的提问来源于stack exchange,提问作者Verance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:03:36