如何用Selenium+BeautifulSoup4高效获取JavaScript配置参数?
结合Selenium与BeautifulSoup4提取JavaScript配置中input参数的高效方案
针对你需要提取页面中require.config.params['matchheader'].input数组的需求,这里提供两种高效实现方案,兼顾准确性和效率:
方案一:Selenium获取源码 + BeautifulSoup定位脚本 + 正则解析
这种方法适合需要同时处理页面其他HTML元素的场景,步骤清晰:
- 用Selenium加载页面并获取完整源码
- 用BeautifulSoup定位目标
<script>标签 - 用正则匹配出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
相关产品推荐
相关产品推荐

