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

R语言rvest爬取歌词存CSV时句子合并无换行如何解决

问题根因

调用html_text()提取节点文本时,会自动丢弃HTML中的<br>换行标签,直接拼接所有连续文本内容,导致歌词原有的换行丢失。

解决方法

两种方案可选,优先使用第一种:

方案1:替换html_text()为html_text2()

rvest 1.0.0及以上版本提供的html_text2()会自动识别<br>、段落标签,将其转换为文本换行符,完全匹配页面展示的文本格式。

方案2:手动替换换行标签(兼容旧版本rvest)

如果本地rvest版本较低无法使用html_text2(),可以先将节点内的所有<br>标签替换为\n字符,再提取文本。

修改后完整代码
library(rvest)
library(dplyr)

link <- "https://www.vagalume.com.br/ivete-sangalo/"

page <- read_html(link)

name_link_full <- page %>% 
  html_nodes('.nameMusic') %>% 
  html_attr("href") %>%        
  paste0("https://www.vagalume.com.br", .)

get_lyrics <- function(lyrics_link){
  lyric <- read_html(lyrics_link)
  # 方案1代码,直接用html_text2
  all_lyrics <- lyric %>% html_nodes('#lyrics') %>% html_text2() 
  
  # 以下是方案2代码,需要用的话注释掉上面一行,取消下面三行注释即可
  # lyrics_node <- lyric %>% html_nodes('#lyrics')
  # xml2::xml_find_all(lyrics_node, ".//br") %>% xml2::xml_add_sibling("text", "\n")
  # all_lyrics <- lyrics_node %>% html_text()
  
  return(all_lyrics)
}

lyr <- sapply(name_link_full, FUN = get_lyrics)

lyrs <- data.frame(
  song_url = names(lyr),
  lyrics = unname(lyr),
  stringsAsFactors = FALSE
)

write.csv(lyrs, 'Ivete.Sangalo.csv', row.names = FALSE)
注意事项
  • 保存的CSV如果用Windows系统自带的记事本打开,换行可能显示为黑块,属于记事本的兼容性问题,用Excel、WPS表格、VS Code等工具打开即可正常显示换行。
  • 代码中调整了生成数据框的逻辑,新增了歌曲链接列,避免行名作为无效列写入CSV,不需要可以自行删除。

内容的提问来源于stack exchange,提问作者Cygnus X-1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:24:03