R语言网络爬虫:高效解析HTML中内嵌的JSON数据


R语言网络爬虫:高效解析HTML中内嵌的JSON数据

本教程详细介绍了如何使用R语言从包含JSON数据的HTML页面中提取并解析所需信息。针对网页源代码中JSON数据被HTML标签包裹的情况,我们将利用rvest包获取页面内容,并通过html_text()提取原始文本,随后借助jsonlite包的parse_json()函数将JSON字符串转换为R数据结构,最终实现对嵌套数据的精确抽取。

1. 引言:解析HTML中JSON的挑战

在进行网络爬虫时,我们通常会遇到两种主要的数据格式:html和json。传统上,rvest包擅长处理标准的html结构,通过css选择器或xpath来定位和提取元素。然而,有些网站会将json数据直接嵌入到html页面的

标签内,而不是作为独立的api响应。在这种情况下,直接使用html_nodes()等html解析函数将无法识别这些被包裹的json内容,因为它们不是标准的html元素。

例如,如果网页源代码看起来像这样:

<html>
<body>
<p>
[
  {"title1": "abc 123", "title2": "bca 321", ...},
  ...
]
</p>
</body>
</html>

rvest会将其视为一个包含文本内容的

标签,而不是一个可直接解析的JSON结构。本教程的目标就是解决这一挑战,展示如何有效地从这类HTML页面中提取并解析JSON数据。

2. 环境准备与数据获取

首先,我们需要加载处理HTML和JSON的R包:rvest用于网页抓取,jsonlite用于JSON解析。

# 安装(如果尚未安装)
# install.packages("rvest")
# install.packages("jsonlite")

# 加载必要的库
library(rvest)
library(jsonlite)

# 目标URL(请替换为实际网址)
# 假设这个URL返回的HTML内容中包含JSON字符串
url <- "https://mywebsite.com/data.json" # 示例URL,实际可能是一个普通的HTML页面
page <- read_html(url)

# 查看初始加载结果
print(page)
# 结果可能类似:
# {html_document}
# <html>
# [1] <body><p>[\n{\n"title1" : "abc 123",\n"title2" : "bca 321",\n"title3" : "cba 213 ...

从print(page)的输出中可以看出,尽管我们使用read_html加载了页面,但内容仍然被

等HTML标签包裹,且内部文本是JSON格式。此时,直接尝试page %>% html_nodes("title4")将返回空结果,因为title4并非HTML标签,而是JSON内部的一个键。

3. 从HTML文档中提取原始JSON字符串

解决问题的关键在于将html_document对象中包含JSON的原始文本内容提取出来。rvest包的html_text()函数正是为此设计的。它能够获取指定HTML节点内的所有文本内容,忽略HTML标签本身。

由于我们的JSON数据被包裹在

标签内,我们可以尝试获取整个页面的文本内容,或者更精确地定位到包含JSON的特定节点。在多数情况下,如果JSON是页面唯一或主要的文本内容,直接对整个html_document对象使用html_text()即可。

YouMind YouMind

AI内容创作和信息整理平台

YouMind 207 查看详情 YouMind
# 提取整个HTML文档的文本内容
json_string <- html_text(page)

# 查看提取出的字符串
# print(json_string)
# 此时,json_string 应该是一个纯粹的JSON字符串,例如:
# "[\n{\n\"title1\" : \"abc 123\",\n\"title2\" : \"bca 321\", ...}]"

现在,我们得到了一个纯净的JSON格式字符串,可以进行下一步的解析。

4. 解析JSON字符串为R数据结构

有了JSON字符串后,jsonlite包的parse_json()函数就派上用场了。这个函数可以将JSON格式的字符串转换为R中的列表(list)或数据框(data.frame)等数据结构。

一个非常实用的参数是simplifyDataFrame = TRUE。当JSON结构允许时,它会尝试将嵌套的JSON对象自动转换为数据框,从而大大简化后续的数据操作。

# 使用jsonlite::parse_json解析JSON字符串
# simplifyDataFrame = TRUE 会尝试将JSON数组和对象转换为数据框
parsed_data <- jsonlite::parse_json(json_string, simplifyDataFrame = TRUE)

# 查看解析后的数据结构
str(parsed_data)
# 结果可能类似:
# 'data.frame': 2 obs. of  4 variables:
#  $ title1: chr  "abc 123" "aec 183"
#  $ title2: chr  "bca 321" "bga 351"
#  $ title3: chr  "cba 213" "cha 293"
#  $ title4:'data.frame':   2 obs. of  2 variables:
#   ..$ title5: chr  "title6" "title6"
#   ..$ title7:List of 2
#   .. ..$ : num  -17662 987622
#   .. ..$ : num  -1.62e+09 6.52e+08

从str(parsed_data)的输出可以看到,JSON数据已经被成功解析为一个R数据框。其中title4本身又是一个嵌套的数据框,而title7则是一个包含数字向量的列表。

5. 数据提取与整理

现在数据已经转换为R对象,我们可以通过标准的R数据访问方式(如$操作符)来提取所需的信息。根据原始问题,我们希望提取每个“块”中title7的值。

parsed_data现在是一个数据框,我们可以通过parsed_data$title4访问到嵌套的title4数据框,再通过parsed_data$title4$title7访问到title7列表。由于title7是一个包含多个数字向量的列表,我们可以使用do.call(rbind, ...)将其合并成一个矩阵。

# 提取 title7 的数据
title7_matrix <- do.call(rbind, parsed_data$title4$title7)

# 查看结果
print(title7_matrix)
# 预期输出:
#               [,1]        [,2]
# [1,] -1.766235e+04    987621.8
# [2,] -1.621626e+09 652238322.1

# 如果需要将其转换为数据框并添加ID列
final_result <- as.data.frame(title7_matrix)
colnames(final_result) <- c("title7_1", "title7_2")
final_result$id <- 1:nrow(final_result)
final_result <- final_result[, c("id", "title7_1", "title7_2")] # 调整列顺序

print(final_result)
# 预期输出:
#   id      title7_1    title7_2
# 1  1 -1.766235e+04    987621.8
# 2  2 -1.621626e+09 652238322.1

通过以上步骤,我们成功地从HTML页面中提取并整理出了所需的JSON数据。

6. 注意事项与最佳实践

  • URL类型识别: 在某些情况下,如果URL直接指向一个纯JSON文件(例如以.json结尾),则可以直接使用jsonlite::fromJSON(url, simplifyDataFrame = TRUE)来一步到位地获取和解析数据,而无需rvest。本教程的方法适用于JSON被HTML标签包裹的情况。
  • JSON结构理解: 在进行数据提取前,务必通过查看原始JSON字符串或使用str()函数了解其结构。这有助于正确地使用$操作符进行访问。
  • 错误处理: 网络请求可能失败,或者JSON字符串可能格式不正确。建议在实际项目中加入错误处理机制,例如使用tryCatch来捕获潜在的错误。
  • simplifyDataFrame的权衡: simplifyDataFrame = TRUE虽然方便,但在某些极端复杂的嵌套JSON结构中可能无法完全将所有数据转换为数据框,此时可能需要手动处理列表结构。
  • 字符编码: 确保在读取和解析过程中正确处理字符编码,避免乱码问题。rvest通常能较好地处理常见编码,但如果遇到特殊情况,可能需要手动指定编码。

7. 总结

本教程展示了在R语言中处理HTML页面内嵌JSON数据的完整流程。通过结合rvest包的read_html()和html_text()函数来获取原始JSON字符串,再利用jsonlite包的parse_json()函数进行高效解析,最终能够灵活地提取和整理出所需的数据。这种方法弥补了传统HTML解析在面对此类特定场景时的不足,极大地扩展了R语言在网络数据抓取方面的能力。掌握这一技巧,将使您在处理各种复杂网页数据时更加游刃有余。

以上就是R语言网络爬虫:高效解析HTML中内嵌的JSON数据的详细内容,更多请关注其它相关文章!


# 将其  # 平山工业厂房网站建设  # 淮南360关键词排名  # 网站建设商业计划书本  # 平谷区营销网络推广行业  # 湛江高效网站建设  # 网站10万条数据优化  # 营销推广用哪个搜索引擎  # 如何找项目网站推广方案  # 兴宁百度网站优化软件  # 丹东seo助手的好方法  # 选择器  # 这一  # 加载  # 内嵌  # 我们可以  # css  # 所需  # 转换为  # 数据结构  # 是一个  # html元素  # json数组  # css选择器  # 数据访问  # 爬虫  # 编码  # 网络爬虫  # node  # json  # js  # html 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: C#解析来自网络的XML流数据 实时错误处理与重试机制  银信通自动开通原因揭秘  j*a中赋值运算符是什么?  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  百度网盘网页入口链接分享 百度网盘官网入口网页登录  支付宝网页版在线入口 支付宝官网电脑登录入口  《下一站江湖2》心法融合技巧  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  利用Flexbox实现图片元素的二维布局:2x2网格排列指南  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  PHP 4 函数中引用参数的默认值限制与解决方案  个人所得税办理入口 个人所得税综合所得年度汇算入口  139邮箱登录入口官网 139邮箱登录入口官网网址  优化 React onClick 事件处理:函数引用与箭头函数的对比  鲁班大师乓乓皮肤获取方法  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  抖音网页版官方链接 抖音网页版官网链接入口  《米姆米姆哈》米姆获取及技能攻略  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  苹果官网国补入口在哪  4399正版网页版入口高清直达链接  《偃武》甘宁技能详解  iCloud官方网站 iCloud网页版在线登录入口  Django模型动态关联检查:高效管理复杂关系  t3出行如何使用微信支付  AO3中文入口稳定分享_AO3官网HTTPS看文详解  《金山词霸》语音翻译方法  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  铁路12306官网入口 铁路12306中国铁路官网登录首页  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  163邮箱在线登录 163邮箱网页版在线入口  4399小游戏下装链接 4399小游戏下载链接入口  如何通过settings.json个性化您的VS Code体验  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  实时数据流中高效查找最小值与最大值  如何高效地基于键列值映射DataFrame中的多个列  Python测试中模块导入路径解析的最佳实践  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  MongoDB聚合管道:高效统计列表中各项的文档数量  三星M34录音变声问题_Samsung M34麦克风调整  智慧职教mooc平台登录网址 智慧职教mooc官网直达  教资成绩怎么查询  Go反射进阶:访问内嵌结构体中的被遮蔽方法  泰拉瑞亚水晶无法放置问题 

 2025-10-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.