使用Selenium从HTML页面抓取嵌入式JSON数据

碧海醫心
发布: 2025-09-19 13:14:11
原创
1153人浏览过

使用Selenium从HTML页面抓取嵌入式JSON数据

本教程详细介绍了如何使用Python和Selenium从HTML页面中提取嵌入在<script>标签内的JSON数据。文章将指导您通过定位包含JSON的脚本元素、提取其内部文本、使用Python的json模块解析数据,并最终获取所需信息(如isrc值)的完整过程。此外,教程还将提供示例代码、通用化策略以及在实际应用中需要注意的最佳实践。

1. 理解问题:为什么直接定位元素无效?

在网页抓取任务中,我们经常遇到需要从html页面中提取特定数据的情况。对于那些以“键:值”形式(如"isrc":"gb-ffm-19-0853")存在的数据,它们往往不是标准的html元素(如<div>、<span>),而是以json格式嵌入在页面的<script>标签内部。在这种情况下,传统的selenium元素定位方法(如通过id、类名、xpath、css选择器直接查找数据本身)通常会失败,因为这些数据并非独立的dom元素,而是作为javascript代码或数据结构的一部分存在。

要解决这个问题,我们需要改变策略:首先定位包含这些JSON数据的<script>标签,然后提取该标签的文本内容,最后将其解析为Python可操作的数据结构。

2. 核心技术:定位、提取与解析

从HTML页面中抓取嵌入式JSON数据主要分为以下几个步骤:

  1. 使用Selenium加载页面:像往常一样,启动WebDriver并导航到目标URL。
  2. 定位包含JSON的<script>标签:这是关键一步。需要找到页面中存储目标JSON数据的特定<script>标签。这可能需要检查页面源代码以确定其位置或特征(例如,它可能是页面中第一个<script>标签,或者包含某些特定文本)。
  3. 提取<script>标签的内部文本:一旦定位到<script>元素,就可以使用get_attribute('innerHTML')或get_attribute('textContent')方法来获取其包含的字符串内容。
  4. 解析JSON字符串:使用Python内置的json模块将提取到的字符串解析为Python字典或列表。
  5. 访问所需数据:通过字典键或列表索引,导航到JSON结构中您需要的具体数据点。

3. 示例代码

以下代码演示了如何从指定网页中提取嵌入在<script>标签内的JSON数据,并获取其中的isrc值。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json
import time

# 初始化WebDriver
# 确保您的ChromeDriver路径正确配置,或者ChromeDriver已添加到系统PATH中
driver = webdriver.Chrome()

try:
    # 导航到目标URL
    target_url = "https://www.audionetwork.com/browse/m/track/purple-beat_1008534"
    driver.get(target_url)

    # 等待页面加载完成,这里可以根据实际情况等待特定的元素出现
    # 例如,等待body标签加载,或者等待某个关键元素出现
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, "body"))
    )

    # 定位包含JSON数据的<script>标签
    # 在本例中,目标JSON位于body内的第一个script标签
    # 注意:这个XPath可能因网站结构变化而需要调整
    script_element = driver.find_element(By.XPATH, "/html/body/script[1]")

    # 提取script标签的innerHTML内容
    json_content_str = script_element.get_attribute('innerHTML')

    # 将JSON字符串解析为Python字典
    content_as_dict = json.loads(json_content_str)

    # 根据JSON结构访问所需数据
    # 这里的路径 'props' -> 'pageProps' -> 'track' -> 'isrc' 是根据目标网站的JSON结构确定的
    isrc_value = content_as_dict['props']['pageProps']['track']['isrc']

    print(f"成功提取到 ISRC 值: {isrc_value}")

except Exception as e:
    print(f"发生错误: {e}")

finally:
    # 关闭浏览器
    driver.quit()
登录后复制

4. 通用化与注意事项

为了使上述方法更具通用性并提高其鲁棒性,请考虑以下几点:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

立即学习前端免费学习笔记(深入)”;

  • 脚本标签的定位
    • 不要依赖硬编码索引:"/html/body/script[1]"这种XPath非常脆弱,如果页面结构稍有变化,就可能失效。
    • 寻找特征:检查<script>标签是否有id、class属性,或者其内容是否包含特定的字符串(例如,script[contains(., 'isrc')])。更稳健的方法是使用By.CSS_SELECTOR或更具体的XPath,结合contains()函数来匹配脚本内容。
    • 示例:如果JSON内容总是包含"isrc"字段,可以尝试By.XPATH, "//script[contains(text(), 'isrc')]"。
  • JSON结构分析
    • 在编写代码之前,务必通过浏览器开发者工具(F12)查看目标网站的源代码,找到包含JSON的<script>标签,并仔细分析其内部的JSON结构。了解数据嵌套的层级是正确访问数据的关键。
    • 使用print(content_as_dict.keys())或逐层打印字典来探索其结构,直到找到目标数据。
  • 错误处理
    • 使用try-except块来捕获可能发生的异常,例如NoSuchElementException(如果脚本标签未找到)或KeyError(如果JSON路径不正确)。
    • 在解析JSON时,json.loads()可能会因为字符串格式不正确而抛出JSONDecodeError,也应进行捕获。
  • 等待策略
    • 在driver.get()之后,页面内容可能不会立即完全加载。使用WebDriverWait结合expected_conditions(如EC.presence_of_element_located或EC.visibility_of_element_located)来等待关键元素(包括包含JSON的脚本标签)出现,可以有效避免因页面加载不完全导致的错误。
  • 资源管理
    • 始终在finally块中调用driver.quit()来关闭浏览器进程,释放系统资源。

5. 总结

通过本教程,您应该已经掌握了使用Selenium从HTML页面中提取嵌入式JSON数据的核心技术。关键在于识别数据并非标准的HTML元素,而是作为字符串存在于<script>标签中。通过定位这些脚本标签、提取其文本内容,并利用Python的json模块进行解析,我们可以有效地访问这些隐藏的数据。在实际应用中,结合健壮的元素定位策略、详细的JSON结构分析和完善的错误处理,将使您的网页抓取任务更加高效和稳定。

以上就是使用Selenium从HTML页面抓取嵌入式JSON数据的详细内容,更多请关注php中文网其它相关文章!

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号