You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rvest抓取XML时合并同一场演讲的多段文本问题

解决方法

核心思路是先遍历每个<SPEECH>节点,在节点内部完成演讲者信息提取与段落文本合并,确保每条数据对应一场完整演讲,从根源解决段落拆分导致的条目数不匹配问题。

具体实现步骤

  1. 定位所有<SPEECH>节点:放弃直接抓取<PARA>,先获取上层的<SPEECH>节点,每个节点对应一场独立演讲。
  2. 单节点信息提取:对每个<SPEECH>节点,分别完成三类信息的提取与处理:
    • 提取<SPEAKER>标签的NAME和SPEAKERID属性值
    • 抓取节点内所有<PARA>的文本内容,合并为单个字符串
    • 清理文本中的冗余换行、空格,保证内容整洁

完整代码示例

library(rvest)
library(purrr)
library(stringr)

url = "你的XML文档URL"
page <- read_html(url)

# 获取所有SPEECH节点
speech_nodes <- page %>% html_elements("speech")

# 遍历节点并整理成数据框
speech_data <- map_dfr(speech_nodes, function(node) {
  # 提取演讲者属性
  speaker_name <- node %>% html_element("speaker") %>% html_attr("name")
  speaker_id <- node %>% html_element("speaker") %>% html_attr("speakerid")
  
  # 合并当前演讲下的所有段落文本
  full_speech <- node %>% 
    html_elements("para") %>% 
    html_text() %>% 
    str_squish() %>% # 清除多余空格、换行
    paste(collapse = " ") # 段落间用空格连接
  
  # 返回单条演讲数据
  tibble(
    speaker_name = speaker_name,
    speaker_id = speaker_id,
    full_speech = full_speech
  )
})

代码说明

  • map_dfr自动将每个节点的处理结果合并为数据框,最终行数与实际演讲场次(65场)完全匹配
  • str_squish用于清理文本中的冗余格式,避免合并后出现大量空白字符
  • 所有信息从同一<SPEECH>节点提取,天然保证演讲者与内容的对应关系

内容的提问来源于stack exchange,提问作者la_bn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:44:54