R语言Web Scraping:高效提取HTML中内嵌的JSON数据

花韻仙語
发布: 2025-10-02 10:42:01
原创
296人浏览过

R语言Web Scraping:高效提取HTML中内嵌的JSON数据

本教程详细讲解如何使用R语言从包含JSON数据的网页中进行数据抓取。当JSON数据以文本形式内嵌于HTML结构中时,传统的HTML解析方法会失效。我们将利用rvest库读取页面内容,并通过html_text函数提取原始文本,随后结合jsonlite::parse_json将其转换为可操作的R数据框,最终实现目标数据的精确提取。

理解挑战:HTML中内嵌的JSON数据

在web数据抓取过程中,我们经常会遇到网页源代码中直接包含json格式数据的场景。这类数据并非通过标准的html标签(如<div>、<span>等)进行结构化,而是作为纯文本字符串存在于html文档的某个部分,通常是<body>或<script>标签内。当使用rvest等库进行常规的html节点选择(例如html_nodes("div")或html_nodes("p"))时,由于json字符串本身不被识别为html节点,这些方法将无法成功提取到所需信息,导致返回空结果。

例如,一个网页的源代码可能呈现如下结构:

<html>
<body>
<p>
[
    {
        "title1" : "abc 123",
        "title2" : "bca 321",
        "title3" : "cba 213",
        "title4" : {"title5": "title6", "title7": [ -17662.3456, 987621.7654]}
    },
    {
        "title1" : "aec 183",
        "title2" : "bga 351",
        "title3" : "cha 293",
        "title4" : {"title5": "title6", "title7": [ -1621626123.23234, 652238322.122]}
    }
]
</p>
</body>
</html>
登录后复制

在这种情况下,我们需要一种策略,首先将整个JSON文本从HTML文档中提取出来,然后将其作为独立的JSON字符串进行解析。

核心工具:rvest与jsonlite

为了解决上述问题,我们将结合使用R语言中的两个强大库:

  1. rvest: 专注于HTML和XML文档的解析。它能帮助我们读取网页内容,并提取其中的文本信息。
  2. jsonlite: 一个轻量级、高性能的JSON解析器和生成器。它能够将JSON字符串方便地转换为R语言中的列表或数据框,反之亦然。

实战步骤:提取与解析内嵌JSON数据

以下是详细的操作步骤,以提取上述示例中title7字段的数据为例。

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

步骤1:加载必要的R包

首先,确保已安装并加载rvest和jsonlite这两个库。

# 如果尚未安装,请先运行以下命令
# install.packages("rvest")
# install.packages("jsonlite")

library(rvest)
library(jsonlite)
登录后复制

步骤2:读取网页内容

使用rvest::read_html()函数读取目标网页的全部内容。即使页面主体是JSON,read_html仍会将其视为一个HTML文档。

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
url <- "https://example.com/data.json" # 请替换为你的目标网址
page_content <- read_html(url)

# 查看读取到的内容,会发现JSON数据被包裹在HTML结构中
print(page_content)
# {html_document}
# <html>
# [1] <body><p>[\n{\n"title1" : "abc 123",\n"title2" : "bca 321",\n...
登录后复制

步骤3:提取原始文本字符串

这是关键一步。我们需要使用html_text()函数从page_content对象中提取出所有的纯文本内容。对于本例,这将直接得到包含JSON数据的完整字符串。

json_string <- html_text(page_content)

# 打印字符串以确认其内容为JSON格式
print(json_string)
# [
# {
# "title1" : "abc 123",
# "title2" : "bca 321",
# ...
登录后复制

步骤4:解析JSON数据

现在我们拥有了纯粹的JSON字符串,可以使用jsonlite::parse_json()函数对其进行解析。为了方便后续的数据操作,建议将simplifyDataFrame参数设置为TRUE,这会尝试将嵌套的JSON对象扁平化为数据框。

parsed_json_data <- jsonlite::parse_json(json_string, simplifyDataFrame = TRUE)

# 查看解析后的数据结构
str(parsed_json_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_json_data现在是一个数据框,其中title4是一个嵌套的数据框,而title4$title7则是一个包含列表的列表,每个子列表代表原始JSON中的一个title7数组。

步骤5:定位并提取目标数据

根据str()的输出,我们可以通过链式索引来访问title4$title7。由于title7是一个列表,其每个元素又是一个包含两个数值的向量,我们可以使用do.call(rbind, ...)将其转换为一个矩阵或数据框,方便进一步处理。

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

# 为结果添加列名(可选)
colnames(target_data) <- c("title7_1", "title7_2")

# 添加一个ID列(可选)
final_result <- data.frame(id = 1:nrow(target_data), target_data)

# 打印最终结果
print(final_result)
#   id      title7_1    title7_2
# 1  1 -1.766235e+04    987621.8
# 2  2 -1.621626e+09 652238322.1
登录后复制

至此,我们已成功从HTML中内嵌的JSON数据中提取出了所需的title7信息,并将其整理成了一个结构化的数据框。

注意事项

  • JSON格式的准确性:确保从网页提取的文本是有效的JSON格式。如果JSON字符串存在语法错误,jsonlite::parse_json()会报错。
  • simplifyDataFrame参数:simplifyDataFrame = TRUE在多数情况下能将JSON转换为易于操作的数据框,但对于非常复杂或结构不规则的JSON,可能需要手动处理嵌套的列表。
  • 网络请求失败:在实际应用中,应考虑网络连接问题或目标网站响应异常。可以使用tryCatch等机制进行错误处理。
  • 网站结构变化:Web Scraping依赖于目标网站的结构。如果网站更新,其HTML或JSON的结构可能会改变,导致现有代码失效。定期检查和维护是必要的。
  • 合法性与道德:在进行Web Scraping时,务必遵守目标网站的robots.txt文件规定,尊重网站的使用条款,并避免对服务器造成过大负担。

总结

本教程展示了一种在R语言中处理HTML页面内嵌JSON数据的有效方法。通过结合rvest库的read_html()和html_text()函数来提取原始文本,再利用jsonlite库的parse_json()函数将JSON字符串转换为R数据结构,我们可以灵活地访问和处理这些数据。这种方法克服了传统HTML节点选择器在处理非标准HTML结构数据时的局限性,为Web Scraping提供了更广阔的可能性。

以上就是R语言Web Scraping:高效提取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号