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

碧海醫心
发布: 2025-10-02 12:04:24
原创
935人浏览过

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

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

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

rvest会将其视为一个包含文本内容的<p>标签,而不是一个可直接解析的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加载了页面,但内容仍然被<body><p>等HTML标签包裹,且内部文本是JSON格式。此时,直接尝试page %>% html_nodes("title4")将返回空结果,因为title4并非HTML标签,而是JSON内部的一个键。

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

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

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

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

# 提取整个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)等数据结构。

Find JSON Path Online
Find JSON Path Online

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

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

一个非常实用的参数是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数据的详细内容,更多请关注php中文网其它相关文章!

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

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

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

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