使用rvest抓取XML时合并同一场演讲的多段文本问题
解决方法
核心思路是先遍历每个<SPEECH>节点,在节点内部完成演讲者信息提取与段落文本合并,确保每条数据对应一场完整演讲,从根源解决段落拆分导致的条目数不匹配问题。
具体实现步骤
- 定位所有
<SPEECH>节点:放弃直接抓取<PARA>,先获取上层的<SPEECH>节点,每个节点对应一场独立演讲。 - 单节点信息提取:对每个
<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
相关产品推荐
相关产品推荐

