利用Python和Selenium从HTML页面高效提取嵌入式JSON数据

花韻仙語
发布: 2025-09-19 16:12:01
原创
853人浏览过

利用python和selenium从html页面高效提取嵌入式json数据

本教程详细介绍了如何使用Python和Selenium从HTML页面中高效提取嵌入的JSON数据。通过定位包含JSON的<script>标签,提取其内容,并利用Python的json模块进行解析,读者可以轻松访问和处理复杂网页中隐藏的数据,如音乐曲目的ISRC码,从而实现更灵活的数据抓取。

在现代网页应用中,许多动态数据并非直接呈现在HTML元素中,而是以JSON(JavaScript Object Notation)格式嵌入在页面的<script>标签内。对于需要抓取这类数据的场景,传统的Selenium元素定位方法(如By.ID, By.CLASS_NAME, By.XPATH直接定位到可见元素)往往无效。本教程将指导您如何利用Selenium结合Python的json模块,有效地从HTML源码中提取并解析这些嵌入式JSON数据。

1. 理解嵌入式JSON数据

当您在浏览器中查看网页源码(通常通过“查看页面源代码”或Ctrl+U)时,可能会发现一些<script>标签中包含了大量键值对结构的数据,这通常就是嵌入式JSON。例如,在音乐数据库页面中,曲目详情(如ISRC码、艺术家信息等)可能被打包成一个JSON对象,供前端JavaScript使用。这种数据格式的特点是:

  • 非DOM可见元素:它们不是常规的HTML元素,无法通过常规的find_element_by_*方法直接获取其文本内容。
  • 结构化:JSON数据以清晰的层级结构组织,易于程序化访问。
  • 动态性:通常由后端服务生成,并在页面加载时注入。

2. 核心思路与步骤

提取嵌入式JSON数据的通用步骤如下:

  1. 使用Selenium加载页面:确保页面完全加载,所有动态内容都已生成。
  2. 定位包含JSON的<script>标签:这是关键一步。您需要检查页面源码,找到包含目标JSON数据的特定<script>标签。
  3. 提取<script>标签的内部HTML内容:这个内容就是JSON字符串。
  4. 使用Python的json模块解析JSON字符串:将字符串转换为Python字典或列表,以便于访问。
  5. 访问目标数据:通过字典键或列表索引导航到所需的数据。

3. 示例:提取音乐曲目的ISRC码

我们将以从一个音乐数据库页面提取特定曲目的ISRC码为例,演示上述步骤。假设目标ISRC码位于页面的某个<script>标签内,其结构类似"isrc":"GB-FFM-19-0853"。

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

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

3.1 准备工作

首先,确保您已安装Python和Selenium库,并配置好ChromeDriver或其他浏览器驱动。

# 安装Selenium
# pip install selenium

# 导入必要的库
from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time # 引入time模块用于简单的等待
登录后复制

3.2 编写提取代码

from selenium import webdriver
from selenium.webdriver.common.by import By
import json
import time

# 初始化WebDriver
# 请确保您的ChromeDriver路径正确配置,或者将chromedriver.exe放在系统PATH中
# driver = webdriver.Chrome(executable_path="C:/path/to/chromedriver.exe")
driver = webdriver.Chrome() # 如果chromedriver在PATH中,可直接这样初始化

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

# 增加一个简单的等待,确保页面内容加载完毕
# 在实际项目中,建议使用更健壮的显式等待(WebDriverWait)
time.sleep(3)

try:
    # 1. 定位包含JSON数据的<script>标签
    # 检查页面源码,确定哪个<script>标签包含了目标JSON。
    # 在本例中,通过XPath '/html/body/script[1]' 定位到body下的第一个script标签。
    # 注意:这个XPath是高度依赖特定页面结构的,实际应用中可能需要调整。
    script_element = driver.find_element(By.XPATH, "/html/body/script[1]")

    # 2. 提取<script>标签的内部HTML内容,即JSON字符串
    json_string = script_element.get_attribute('innerHTML')

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

    # 4. 访问目标数据 (ISRC码)
    # 根据JSON的结构,层层深入获取'isrc'值。
    # 这里的键路径 'props' -> 'pageProps' -> 'track' -> 'isrc' 也是特定于该网站的。
    isrc_value = content_as_dict['props']['pageProps']['track']['isrc']

    print(f"成功提取的ISRC码为: {isrc_value}")

except Exception as e:
    print(f"提取ISRC码时发生错误: {e}")
    # 可以在这里打印json_string或content_as_dict来帮助调试
    # print(f"原始JSON字符串:\n{json_string}")
    # print(f"解析后的字典:\n{content_as_dict}")

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

3.3 代码解析

  • driver.get(target_url):加载目标网页。
  • time.sleep(3):一个简单的硬等待,确保页面有足够时间加载。在生产环境中,推荐使用WebDriverWait结合expected_conditions来实现更智能的等待,例如等待某个元素出现或JavaScript执行完毕。
  • driver.find_element(By.XPATH, "/html/body/script[1]")
    • 这是最关键的一步。它通过XPath定位到HTML文档<body>标签下的第一个<script>标签。
    • 重要提示:这个XPath (/html/body/script[1]) 是针对本示例页面的特定结构。在抓取其他网站时,您需要通过浏览器的开发者工具(通常按F12键)检查页面源码,找到包含目标JSON数据的正确<script>标签,并构建相应的XPath或CSS选择器。例如,如果<script>标签有一个id或class,或者它包含了特定的文本,可以使用更精确的选择器(如By.ID("some-script-id")或By.CSS_SELECTOR("script[data-type='json']"))。
  • script_element.get_attribute('innerHTML')
    • 一旦定位到<script>元素,get_attribute('innerHTML')方法用于提取该标签内部的所有HTML内容,这正是我们所需的JSON字符串。
  • json.loads(json_string)
    • Python的json模块提供了处理JSON数据的功能。json.loads()函数用于将一个JSON格式的字符串解析成Python的数据结构(通常是字典或列表)。
  • content_as_dict['props']['pageProps']['track']['isrc']
    • 解析后的JSON数据是一个Python字典。您需要根据JSON的实际结构,通过键(key)逐层访问到所需的值。这同样需要您通过检查JSON结构来确定正确的访问路径。

4. 通用性与注意事项

  • 定位<script>标签的准确性:这是整个过程中最具挑战性的一步。不同的网站会将JSON数据放在不同的<script>标签中,或者以不同的方式命名这些标签。务必使用开发者工具仔细检查。
    • XPath/CSS选择器:尝试寻找具有独特属性(如id、class、data-*属性)的<script>标签。
    • 文本内容:有时,可以通过contains(text(), 'some_keyword_in_json')来定位包含特定文本的<script>标签。
  • JSON结构的变化:网站的JSON结构可能会更新。您的代码需要对这些变化具有一定的鲁棒性,或者在结构发生变化时进行调整。
  • 错误处理:在实际应用中,应添加try-except块来处理可能出现的错误,例如script标签未找到、JSON解析失败、或字典键不存在等情况。
  • 动态加载:如果JSON数据是通过AJAX请求在页面加载后动态获取的,您可能需要等待这些请求完成,或者直接拦截网络请求来获取JSON数据,而不是从HTML中提取。
  • 反爬机制:某些网站可能实施了反爬虫机制,导致Selenium访问受阻。这可能需要结合代理IP、User-Agent伪装、验证码识别等高级技术。

5. 总结

通过本教程,您应该已经掌握了如何使用Python和Selenium从HTML页面中提取并解析嵌入式JSON数据的通用方法。这种技术对于抓取那些不直接显示在DOM中的复杂数据至关重要。记住,关键在于准确地定位包含JSON的<script>标签,并理解其内部JSON数据的结构,以便正确地进行解析和访问。

以上就是利用Python和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号