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

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

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

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

在web数据抓取过程中,我们经常会遇到网页源代码中直接包含json格式数据的场景。这类数据并非通过标准的html标签(如

、等)进行结构化,而是作为纯文本字符串存在于html文档的某个部分,通常是或标签内。当使用rvest等库进行常规的html节点选择(例如html_nodes(“div”)或html_nodes(“p”))时,由于json字符串本身不被识别为html节点,这些方法将无法成功提取到所需信息,导致返回空结果。

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

%ignore_pre_1%

在这种情况下,我们需要一种策略,首先将整个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文档。

    url <- "https://example.com/data.json" # 请替换为你的目标网址page_content <- read_html(url)# 查看读取到的内容,会发现JSON数据被包裹在HTML结构中print(page_content)# {html_document}# # [1] 

    [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数据的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1580400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 21:26:25
下一篇 2025年12月22日 21:26:41

相关推荐

  • 构建响应式多列布局:利用浮动和媒体查询实现自适应设计

    本教程将详细阐述如何使用CSS的float: left属性和媒体查询技术,构建一个在不同屏幕尺寸下(如PC、iPad、手机)能自动调整列数的响应式多列布局。文章将涵盖关键CSS属性、HTML结构、清除浮动技巧以及box-sizing的重要性,并通过代码示例指导读者实现从三列到两列再到单列的无缝转换。…

    2025年12月22日
    000
  • Django表单提交与URL动态重定向:实现搜索功能

    本文详细介绍了如何在Django应用中实现用户通过表单提交搜索关键词,并将其动态地附加到URL路径中,从而实现友好的搜索结果展示。我们将重点讲解urls.py的配置、views.py中redirect函数的使用以及如何正确地将表单数据传递给动态URL,确保搜索功能的高效与规范。 1. 理解需求与核心…

    2025年12月22日
    000
  • JavaScript模块脚本加载:解决type=”module”下的路径问题

    本文探讨了在HTML中使用type=”module”加载JavaScript模块时可能遇到的脚本不执行问题。核心原因常在于脚本路径的指定方式。通过在src属性中使用明确的相对路径(如./script.js),可以有效解决此问题,确保模块脚本被正确识别和执行,尤其是在本地开发环…

    2025年12月22日
    000
  • JavaScript中实现点击播放新音频时停止当前音频的教程

    本教程详细阐述了在JavaScript中如何高效管理网页音频播放,确保用户点击播放新音乐时,当前正在播放的音乐能够自动停止。通过维护一个全局的音频对象引用,我们可以在每次播放新音频前暂停旧的音频实例,从而避免多个音频同时播放的混乱情况,显著提升用户体验。 引言 在网页应用中,尤其是在音乐播放器或包含…

    2025年12月22日
    000
  • R语言网页抓取:从HTML文档中提取内嵌JSON数据

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

    2025年12月22日
    000
  • HTML文件DOCCYPE异变:富文本编辑器对代码的影响与解决方案

    当HTML文件在不同编辑器中显示不一致,特别是纯文本编辑器(如Vim)显示出额外内容时,这通常是由于使用了富文本编辑器(如macOS的TextEdit)保存了文件。富文本编辑器在保存时会注入其自身的格式化信息、元数据和样式,从而改变了原始的纯净HTML代码结构,导致DOCCYPE或文件内容发生意想不…

    2025年12月22日
    000
  • 掌握CSS Float与媒体查询:构建自适应多列布局

    本文详细阐述了如何利用CSS的float属性和媒体查询技术,实现一个在不同屏幕尺寸下(如桌面、平板和手机)能自动适应并调整列数(从三列到两列再到一列)的响应式多列布局。通过清晰的代码示例和专业指导,帮助读者掌握创建灵活且用户体验友好的网页布局的关键方法。 引言:构建响应式多列布局的挑战 在现代网页设…

    2025年12月22日 好文分享
    000
  • 移除 Bootstrap 导航栏内边距的有效方法

    本文针对Bootstrap导航栏内边距移除问题,提供了一种有效的解决方案。通过将页面主体内容放置在导航栏之后的容器中,并对该容器应用内边距样式,可以避免全局内边距样式对导航栏的影响,从而实现导航栏的无内边距效果,同时保持页面其他元素的样式不变。 在Bootstrap项目中,有时我们需要对导航栏进行特…

    2025年12月22日
    000
  • 移除 Bootstrap 导航栏内边距的正确方法

    本文旨在解决在使用 Bootstrap 框架时,如何仅移除导航栏(Navbar)的内边距,同时保持页面其他元素的内边距不变的问题。通过调整 HTML 结构和 CSS 样式,实现导航栏与页面边缘无缝贴合的效果,同时避免影响页面整体布局。文章将提供详细的代码示例和注意事项,帮助开发者轻松实现这一目标。 …

    2025年12月22日
    000
  • HTML如何给全站页面加水印_HTML给全站页面加水印的实现教程

    全站水印可通过CSS或JavaScript实现,CSS方法简单高效但易被移除,适用于基础版权保护;JavaScript方法灵活可动态生成多水印并监听页面变化重载,防护性更强但影响性能。为防移除,可采用类名混淆、!important声明、MutationObserver监控及代码混淆等手段,结合媒体查…

    2025年12月22日
    000
  • 优化基于LocalStorage的语言偏好设置与页面重载策略

    本文深入探讨了如何高效地实现基于LocalStorage的语言偏好切换功能,并着重解决了因不当使用location.reload()导致的无限重载循环问题。通过引入window.location.hash进行状态检查,我们能够避免不必要的页面刷新,并提供了一个支持多语言的通用解决方案,确保用户体验的…

    2025年12月22日
    000
  • JavaScript与CSS Flexbox实现高性能多实例轮播图

    本文深入探讨了在JavaScript中构建多个独立轮播图时常遇到的translateX冲突问题。通过将轮播图逻辑模块化,为每个实例创建独立的控制,并结合CSS Flexbox布局与父容器的translateX动画,我们能有效避免全局选择器带来的副作用,实现高性能、可复用且无冲突的多实例轮播图组件。 …

    2025年12月22日 好文分享
    000
  • htm如何转换txt_将HTM文件转换为TXT的步骤

    将HTM转TXT需提取网页中的纯文本内容。首先用浏览器打开HTM文件,右键选择“查看页面源代码”可查看HTML结构,但更推荐直接复制页面渲染后的文字内容。选中所需文字,按Ctrl+C复制,再粘贴到记事本等纯文本编辑器中,系统会自动去除大部分HTML格式。粘贴后检查是否存在残留链接或乱码,并手动清理。…

    2025年12月22日
    000
  • JavaScript 文件输入处理、扩展名验证与字符串操作实践指南

    本教程将深入探讨JavaScript中如何正确处理input type=”file”元素,实现文件选择后的扩展名验证,并介绍灵活的字符串操作方法,特别是如何移除字符串中的特定字符或子串。我们将通过事件监听器、includes()和replace()等核心API,提供清晰的代码…

    2025年12月22日
    000
  • 解决HTML中type=’module’脚本加载失败的问题:路径配置与最佳实践

    本文旨在解决在HTML文件中使用type=’module’加载JavaScript模块时遇到的脚本不执行问题。核心原因常在于相对路径的解析差异。教程将详细阐述如何通过明确指定当前目录路径(./)来确保模块正确加载,并提供相关代码示例和注意事项,帮助开发者理解并避免此类常见错误…

    2025年12月22日
    000
  • 解决两列布局中页脚错位与浮动清除的实践指南

    在CSS布局中,使用float属性创建两列或多列布局时,常会遇到页脚错位或背景异常的问题。这通常是由于浮动元素脱离文档流导致父容器高度塌陷所致。本文将深入探讨这一问题,并提供三种主流的浮动清除技术——clear属性、overflow: hidden以及clearfix技巧,帮助开发者实现精确且稳定的…

    2025年12月22日 好文分享
    000
  • HTML代码怎么实现分步表单_HTML代码分步表单设计与步骤切换功能实现

    分步表单通过HTML结构、CSS控制显示隐藏、JavaScript管理步骤切换与数据验证,提升用户体验。首先构建包含多个步骤的HTML骨架,每个步骤用div包裹并默认隐藏,仅显示第一步;通过CSS定义.form-step.active显示当前步骤,并设计进度条指示器展示流程。JavaScript使用…

    2025年12月22日
    000
  • JavaScript字符串操作与文件扩展名验证教程

    本文旨在指导开发者如何正确进行JavaScript字符串操作,特别是针对移除特定字符或子串的需求,并详细讲解如何通过事件监听器实现文件上传前的扩展名验证。文章将纠正常见的字符串处理误区,并提供使用String.prototype.replace()、String.prototype.includes…

    2025年12月22日
    000
  • 使用 Angular 实现圆形排列的图形

    本文档旨在指导开发者使用 Angular 框架,结合 HTML Canvas 或 SVG 技术,实现在一个中心圆形周围排列多个小圆形的布局。我们将探讨如何利用 Angular 组件和 Canvas API 或 SVG 元素动态生成和定位这些圆形,并提供示例代码和注意事项,帮助开发者快速实现类似效果。…

    2025年12月22日
    000
  • HTML表格横向滚动时固定列的CSS格式实现方法

    答案:通过CSS的position: sticky结合table结构可实现横向滚动时固定列。具体为设置容器overflow-x: auto,表格宽度自适应,对需固定的列添加sticky定位并指定left值,同时设置背景色和z-index以确保视觉效果和层级覆盖,适用于现代浏览器且无需JavaScri…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信