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
相关产品推荐
相关产品推荐

