R语言网页抓取:从HTML文档中提取内嵌JSON数据

心靈之曲
发布: 2025-10-02 10:51:01
原创
357人浏览过

R语言网页抓取:从HTML文档中提取内嵌JSON数据

本教程详细阐述了如何使用R语言从看似HTML但实际包含JSON字符串的网页中高效提取数据。核心步骤包括利用rvest库获取页面文本内容,然后结合jsonlite库将提取到的JSON字符串解析为R数据结构,最终实现对嵌套数据的精准抽取与整理,特别适用于处理API响应或动态加载的数据。

1. 引言:理解问题与挑战

在进行网页数据抓取(web scraping)时,我们通常会遇到各种数据格式。一种常见但容易令人困惑的情况是,网页的源代码(html)中并没有清晰的html标签来组织我们所需的数据,而是将完整的json格式数据直接嵌入到某个html元素(如<body>或<p>)的文本内容中。

例如,一个网页的HTML结构可能看起来像这样:

<html>
<body>
<p>[
  {
    "title1": "abc 123",
    "title2": "bca 321",
    "title3": "cba 213",
    "title4": {"title5": "title6", "title7": [ -17662.3456, 987621.7654]}
  },
  ...
]</p>
</body>
</html>
登录后复制

在这种情况下,如果我们尝试使用rvest库的html_nodes()函数去查找像title4这样的"标签",将会一无所获,因为title4并非HTML标签,而是JSON对象中的一个键。正确的做法是识别出内嵌的JSON字符串,并将其作为纯文本提取出来,再进行JSON解析。

2. 所需R包

为了解决这个问题,我们需要以下两个R包:

  • rvest: 用于从网页读取HTML内容并提取文本。
  • jsonlite: 用于解析JSON格式的字符串数据。

如果尚未安装,请使用以下命令安装它们:

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

install.packages(c("rvest", "jsonlite"))
登录后复制

3. 抓取并初步检查网页内容

首先,我们需要使用rvest库来加载目标网页。read_html()函数会读取URL并将其解析为一个HTML文档对象。

library(rvest)
library(jsonlite) # 提前加载jsonlite

# 示例URL,请替换为您的实际URL
# 注意:本示例使用了一个假设的URL,实际操作中请替换为包含JSON的真实网页
url <- "https://mywebsite.com/data.json" # 假设这是一个直接返回JSON的URL,或包含JSON的HTML页面
page <- read_html(url)

# 检查页面对象
print(page)
# 预期输出可能类似:
# {html_document}
# <html>
# [1] <body><p>[\n{\n"title1" : "abc 123",\n"title2" : "bca 321", ...
登录后复制

从print(page)的输出中,我们可以看到JSON数据被包裹在HTML标签(如<body><p>)中。str(page)则会显示这是一个xml_document或html_document对象,而不是一个可以直接操作的JSON结构。

4. 提取原始JSON字符串

这是解决问题的关键一步。由于JSON数据是作为HTML元素(例如<p>标签)的文本内容存在的,我们需要使用html_text()函数来提取这些文本。如果JSON数据是整个页面的主要内容,直接对整个page对象使用html_text()即可。如果JSON数据位于某个特定的HTML标签内,则需要先定位到该标签,再提取其文本。

在本例中,假设JSON数据是页面主体内容,直接提取整个页面的文本通常是有效的:

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文档的纯文本内容
json_string <- html_text(page)

# 打印前几行查看提取到的字符串
cat(substr(json_string, 1, 500)) # 打印前500个字符
登录后复制

此时,json_string变量中存储的就是我们需要的完整JSON格式字符串。

5. 解析JSON数据

有了纯净的JSON字符串后,我们就可以使用jsonlite库的parse_json()函数来将其解析为R中的数据结构。

parse_json()函数会将JSON字符串转换为R的列表(list)结构。一个非常有用的参数是simplifyDataFrame = TRUE,它会尝试将嵌套的JSON对象和数组自动转换为R的数据框(data.frame),从而大大简化了后续的数据操作。

# 使用jsonlite解析JSON字符串
parsed_data <- parse_json(json_string, simplifyDataFrame = TRUE)

# 检查解析后的数据结构
str(parsed_data)
登录后复制

通过str(parsed_data)的输出,我们可以清晰地看到JSON数据已经被成功转换为R中的列表和数据框的组合。例如,它可能显示parsed_data是一个包含多个观测值的列表,每个观测值又是一个包含title1、title2、title3和title4的数据框。而title4本身又是一个数据框,其中包含title5和title7。title7则是一个列表,每个元素是包含两个数值的向量。

6. 访问和整理目标数据

根据str(parsed_data)的输出,我们可以通过$符号逐级访问到我们感兴趣的数据。我们的目标是提取所有“块”中的title7数据,并将其整理成一个包含id、title7_1和title7_2列的数据框。

# 访问目标数据:parsed_data$title4$title7
# 此时parsed_data$title4$title7是一个列表,每个元素是一个包含两个数值的向量

# 将列表转换为矩阵
extracted_title7_matrix <- do.call(rbind, parsed_data$title4$title7)

# 将矩阵转换为数据框
final_df <- as.data.frame(extracted_title7_matrix)

# 为数据框的列命名
colnames(final_df) <- c("title7_1", "title7_2")

# 添加id列
final_df$id <- 1:nrow(final_df)

# 调整列的顺序以符合预期输出
final_df <- final_df[, c("id", "title7_1", "title7_2")]

# 打印最终结果
print(final_df)
登录后复制

最终的final_df数据框将包含id、title7_1和title7_2三列,满足了我们对数据提取和整理的要求。

7. 注意事项与最佳实践

  • URL的准确性: 确保您提供的URL确实是包含目标JSON数据的页面。有时JSON数据是通过JavaScript动态加载的,直接抓取HTML可能无法获取到。在这种情况下,您可能需要检查浏览器的开发者工具(Network标签页)来找到实际加载JSON数据的API请求。
  • JSON结构的理解: 在解析之前,通过浏览器开发者工具或在线JSON格式化工具检查JSON的实际结构非常重要。这将帮助您理解数据的嵌套层级,从而正确地使用$符号进行访问。
  • 错误处理: 在实际应用中,网页抓取容易遇到各种问题,例如网络连接失败、页面结构变化、JSON格式错误等。建议使用tryCatch或其他错误处理机制来提高代码的健壮性。
  • parse_json() vs fromJSON(): jsonlite包提供了parse_json()和fromJSON()两个函数。parse_json()更底层,返回R列表;fromJSON()则更高级,可以直接读取文件或URL,并尝试将JSON数据直接转换为数据框。对于复杂或嵌套结构,parse_json()结合simplifyDataFrame = TRUE通常更灵活,能更好地控制解析过程。
  • 数据类型转换: jsonlite在解析时会尝试推断数据类型。如果JSON中的数值是字符串形式,或者存在混合类型,可能需要手动进行类型转换。
  • 性能考虑: 对于非常大的JSON文件或频繁的抓取,考虑缓存数据或优化解析逻辑。

8. 总结

通过本教程,我们学习了如何使用R语言有效处理网页中内嵌的JSON数据。核心流程包括:

  1. 利用rvest::read_html()加载网页。
  2. 使用rvest::html_text()从HTML文档中提取包含JSON的纯文本字符串。
  3. 借助jsonlite::parse_json()(配合simplifyDataFrame = TRUE)将JSON字符串解析为R中的数据结构。
  4. 通过列表和数据框的索引操作,精准提取并整理出所需的数据。

掌握这一技巧,将使您能够更灵活地从各种网页源中获取和处理数据,特别是那些依赖JSON进行数据交换的现代Web应用。

以上就是R语言网页抓取:从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号