
在进行网络爬虫时,我们通常会遇到两种主要的数据格式: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数据。
首先,我们需要加载处理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内部的一个键。
解决问题的关键在于将html_document对象中包含JSON的原始文本内容提取出来。rvest包的html_text()函数正是为此设计的。它能够获取指定HTML节点内的所有文本内容,忽略HTML标签本身。
由于我们的JSON数据被包裹在
或标签内,我们可以尝试获取整个页面的文本内容,或者更精确地定位到包含JSON的特定节点。在多数情况下,如果JSON是页面唯一或主要的文本内容,直接对整个html_document对象使用html_text()即可。
YouMind
AI内容创作和信息整理平台
207
查看详情
# 提取整个HTML文档的文本内容
json_string <- html_text(page)
# 查看提取出的字符串
# print(json_string)
# 此时,json_string 应该是一个纯粹的JSON字符串,例如:
# "[\n{\n\"title1\" : \"abc 123\",\n\"title2\" : \"bca 321\", ...}]"现在,我们得到了一个纯净的JSON格式字符串,可以进行下一步的解析。
有了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则是一个包含数字向量的列表。
现在数据已经转换为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数据。
本教程展示了在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
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。