如何使用Python Selenium从HTML源码中抓取内嵌JSON的ISRC数据
Selenium抓取页面内嵌JSON中ISRC字段的实现方案
问题原因
常规DOM定位方法无法拿到ISRC值的核心原因是:这个字段不是独立的HTML元素,而是直接写在页面源码内嵌的JSON数据里,属于文本内容的一部分,不存在对应的DOM节点,自然无法通过XPath、id、CSS选择器直接定位。
通用实现思路
该方法适配所有同结构的曲目详情页,不需要针对不同ISRC值做单独调整:
- 替换代码里固定
sleep()的硬等待逻辑,改用Selenium的显式等待,等目标元素加载完成再执行操作,解决等待机制不可靠的问题 - 进入曲目详情页、页面加载完成后,直接获取整个页面的源码文本
- 用正则表达式匹配源码中固定格式的
"isrc":"编码值"结构,提取捕获到的ISRC内容即可
可直接运行的修正代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import re # 初始化浏览器 path = "C:\Program Files (x86)\chromedriver.exe" driver = webdriver.Chrome(path) # 设置显式等待最长超时时间10秒 wait = WebDriverWait(driver, 10) driver.get("https://www.audionetwork.com/track/searchkeyword") # 等待搜索框加载完成后输入内容 search = wait.until(EC.presence_of_element_located((By.ID, "js-keyword"))) search.send_keys("ANW3175_001_Purple-Beat.wav") search.send_keys(Keys.RETURN) # 等待搜索结果的曲目链接加载完成后点击 music_link = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.track__title"))) music_link.click() # 等待详情页加载完成,获取全页源码 wait.until(EC.presence_of_element_located((By.TAG_NAME, "body"))) page_source = driver.page_source # 正则匹配ISRC字段,兼容所有符合规范的ISRC编码 isrc_match = re.search(r'"isrc":"([A-Z0-9\-]+)"', page_source) if isrc_match: isrc_code = isrc_match.group(1) print(f"抓取到的ISRC编号:{isrc_code}") else: print("当前页面未匹配到ISRC字段") driver.quit()
方案说明
- 正则规则
r'"isrc":"([A-Z0-9\-]+)"'会匹配所有双引号包裹的isrc键值对,捕获组只提取ISRC编码本身,不会带多余的引号和键名,不管曲目对应的ISRC是什么值都能正常匹配 - 显式等待会在元素加载完成后立刻执行下一步,比固定等待效率更高,也不会出现页面加载慢导致的元素找不到报错
- 如果后续需要提取更多内嵌JSON字段,也可以先定位到对应的script标签取出完整JSON字符串解析后再取值,对于单个ISRC字段来说正则匹配是最轻量通用的方案
内容的提问来源于stack exchange,提问作者Jay Bee
相关产品推荐
相关产品推荐

