新闻中心

使用R语言与stringr包从HTML字符串中提取结构化信息

2025-11-18
浏览次数:
返回列表

使用R语言与stringr包从HTML字符串中提取结构化信息

本教程详细介绍了如何利用r语言中的`stringr`包和正则表达式,从包含复杂html标签的字符串列中精准提取特定数据,并将其转换为新的独立列。文章通过具体代码示例,演示了从原始数据准备、模式匹配、数据清洗到最终整合的完整流程,旨在帮助用户高效处理非结构化文本数据,实现数据结构的优化与重构。

引言:解析复杂字符串数据的挑战

在数据分析实践中,我们经常会遇到需要从非结构化或半结构化字符串中提取特定信息的场景。例如,一个数据框的某一列可能包含长篇的HTML片段、XML结构或自定义格式的文本,其中混杂着我们所需的关键数据。手动解析这些字符串既耗时又容易出错。R语言提供了强大的文本处理能力,特别是结合stringr包和正则表达式,可以高效、准确地自动化这一过程。

本教程将以一个具体的例子,演示如何从包含标签的HTML字符串中提取对应的数值和文本信息,并将其转化为数据框中的独立列。

R语言与stringr包:文本处理利器

stringr是R语言中一个现代化、用户友好的字符串处理包,它提供了一系列功能强大且直观的函数,用于字符串的检测、提取、替换、分割等操作。其核心优势在于与正则表达式(Regex)的无缝集成,使得复杂的模式匹配和数据提取变得简单高效。

正则表达式是一种描述字符串模式的强大工具。通过学习和掌握正则表达式,我们可以定义出极其精确的匹配规则,从而在各种复杂的文本中找到并操作目标数据。

实战演练:从HTML字符串中提取数据

我们将通过一个具体的案例来演示如何利用stringr包和正则表达式从HTML字符串中提取数据。

1. 准备示例数据

首先,我们创建一个包含姓名(name)和生物信息(bio)的数据框。bio列中包含了我们希望提取的信息。为了演示健壮性,我们额外添加了一行不包含所有目标标签的数据。

library(stringr)

# 示例数据
name <- c("John", "Max", "Jane")
bio <- c(
    "<status>1</status><profession>Revisor</professio>",
    "<status>1</status><born>19.06.1995</born><profession>Tech</professio>",
    "<born>1990</born><hobby>Reading</hobby>" # 示例:没有status和profession标签
)

df <- data.frame(name, bio)
print(df)

输出:

  name                                                bio
1 John    <status>1</status><profession>Revisor</professio>
2  Max <status>1</status><born>19.06.1995</born><profession>Tech</professio>
3 Jane                   <born>1990</born><hobby>Reading</hobby>

2. 提取“status”信息

我们需要从bio列中提取标签内的数字。这个过程分为两步:首先匹配包含完整标签的字符串,然后替换掉标签,只保留数字。

ChatCut ChatCut

AI视频剪辑工具

ChatCut 1086 查看详情 ChatCut
# 步骤1: 使用 str_extract_all 提取包含 <status> 标签的完整字符串
# pattern = "<status>\d</status>" 匹配以 <status> 开头,接着一个数字(\d),再以 </status> 结尾的字符串。
status_list <- stringr::str_extract_all(df$bio, pattern = "<status>\d</status>")
print("提取到的原始status列表:")
print(status_list)

# 步骤2: 使用 str_replace_all 替换标签,只保留数字
# pattern = "(<status>)(\d)(</status>)" 定义了三个捕获组。
# "\2" 表示在替换时只使用第二个捕获组的内容(即数字)。
status_cleaned_list <- stringr::str_replace_all(status_list, pattern = "(<status>)(\d)(</status>)", "\2")
print("清洗后的status列表:")
print(status_cleaned_list)

# 将列表转换为向量,并处理无匹配时产生的 NA
status_vector <- as.numeric(unlist(lapply(status_cleaned_list, function(x) if(length(x) == 0) NA else x)))
print("转换为向量的status:")
print(status_vector)

输出:

[1] "提取到的原始status列表:"
[[1]]
[1] "<status>1</status>"

[[2]]
[1] "<status>1</status>"

[[3]]
character(0)

[1] "清洗后的status列表:"
[[1]]
[1] "1"

[[2]]
[1] "1"

[[3]]
character(0)

[1] "转换为向量的status:"
[1]  1  1 NA

3. 提取“profession”信息

与提取status类似,我们从bio列中提取标签内的职业名称。

# 步骤1: 使用 str_extract_all 提取包含 <profession> 标签的完整字符串
# pattern = "<profession>[:alpha:]*</professio>" 匹配 <profession> 开头,接着零个或多个字母字符 ([:alpha:]*),再以 </professio> 结尾。
profession_list <- stringr::str_extract_all(df$bio, pattern = "<profession>[:alpha:]*</professio>")
print("提取到的原始profession列表:")
print(profession_list)

# 步骤2: 使用 str_replace_all 替换标签,只保留职业名称
# pattern = "(<profession>)([:alpha:]*)(</professio>)" 定义了三个捕获组。
# "\2" 表示只保留第二个捕获组的内容(即职业名称)。
profession_cleaned_list <- stringr::str_replace_all(profession_list, pattern = "(<profession>)([:alpha:]*)(</professio>)", "\2")
print("清洗后的profession列表:")
print(profession_cleaned_list)

# 将列表转换为向量,并处理无匹配时产生的 NA
profession_vector <- unlist(lapply(profession_cleaned_list, function(x) if(length(x) == 0) NA_character_ else x))
print("转换为向量的profession:")
print(profession_vector)

输出:

[1] "提取到的原始profession列表:"
[[1]]
[1] "<profession>Revisor</professio>"

[[2]]
[1] "<profession>Tech</professio>"

[[3]]
character(0)

[1] "清洗后的profession列表:"
[[1]]
[1] "Revisor"

[[2]]
[1] "Tech"

[[3]]
character(0)

[1] "转换为向量的profession:"
[1] "Revisor" "Tech"    NA

4. 整合结果到新的数据框

最后,我们将提取并清洗后的status和profession向量作为新列,添加到原始数据框中,或创建一个新的数据框。

df_final <- data.frame(
    name = df$name,
    status = status_vector,
    profession = profession_vector
)
print(df_final)

输出:

  name status profession
1 John      1    Revisor
2  Max      1       Tech
3 Jane     NA       <NA>

正则表达式模式解析

理解本教程中使用的正则表达式模式是掌握其核心的关键:

  • \d: 匹配任何单个数字字符(0-9)。
  • [:alpha:]: 匹配任何单个字母字符(a-z, A-Z)。
  • *: 量词,匹配前一个元素零次或多次。例如,[:alpha:]* 匹配零个或多个字母。
  • (): 捕获组。括号内的模式匹配到的内容会被“捕获”,可以在替换字符串中通过 \1、\2 等引用。
    • 在 "()(\d)()" 中:
      • () 是第一个捕获组。
      • (\d) 是第二个捕获组,捕获数字。
      • () 是第三个捕获组。
    • 因此,\2 指代的就是捕获到的数字。
  • str_extract_all(): 返回一个列表,其中每个元素对应输入向量中的一个字符串,该元素是一个字符向量,包含所有匹配到的子字符串。
  • str_replace_all(): 对输入字符串中所有匹配到的模式进行替换。如果输入是一个列表,它会对列表中的每个元素进行操作。

注意事项与

以上就是使用R语言与stringr包从HTML字符串中提取结构化信息的详细内容,更多请关注其它相关文章!


# 重构  # 黄石白酒网站推广哪个好  # 临沂行业网站建设公司  # 兵团建设云新网站  # 重庆南川网站优化哪个好  # 建设工程的信息网站  # 淘宝店铺运营和seo  # 昌邑网站如何做推广赚钱  # 提供福州seo机构服务  # 柏乡网站建设加盟报价  # 网络优化师常用网站  # 必看  # html  # 多个  # 是一个  # 跨行  # 第二个  # 数据结构  # 结构化  # 转换为  # 数据清洗  # 工具  # app  # 正则表达式 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 铁路12306的积分有效期是多久_铁路12306积分有效期说明  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  12306怎么选座位选到安静区_12306选座安静区域选择策略  微信语音通话掉线如何解决 微信语音通话稳定优化方法  知音漫客正版漫画平台_知音漫客官网账号登录  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  谷歌推RCS信息存档功能:公司可监控员工私密信息!  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  J*aScript 字符串标签转换:使用正则表达式高效替换  文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】  DLsite中文平台入口 DLsite官网内容在线查看  Python类型检查:优化关联可选属性的Mypy推断策略  J*aScript map 迭代中检测空数组元素的有效方法  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  c++ dfs和bfs代码 c++深度广度优先搜索算法  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  Node.js中HTML按钮与J*aScript函数交互的正确姿势  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  Go RPC HTTP服务正确实现与常见陷阱解析  steam官方入口大全 steam账号注册及操作指南  J*aScript生成器_j*ascript异步迭代  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  写好的html代码怎么运行出来_运行写好的html代码方法【教程】  微信网页版登录教程_微信网页版登录入口在哪  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  Angular Material 垂直步进器:实现底部到顶部排序的教程  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  Win11怎么开启高性能模式_Windows 11电源计划优化设置  在Pyomo中实现基于变量的条件约束:Big-M方法详解  Python大型XML文件高效流式解析教程  淘宝网网页版登录入口 淘宝官方网页版快捷登录  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  解决深度学习模型训练初期异常高损失与完美验证准确率问题  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  在Go Martini框架中高效服务动态生成图像的实践指南  《主播少女的秘密账号迷宫》首支宣传片  妖精动漫免费平台 妖精动漫官网资源观看网址 

搜索