【问题标题】:Web scraping returns merged sentences in R网页抓取返回 R 中的合并句子
【发布时间】:2021-11-18 12:06:07
【问题描述】:

我从链接https://www.vagalume.com.br/ivete-sangalo/ 中抓取了一些歌词。在那里,歌词显示如下(只是一个 sn-p):

 Quando a chuva passar

 Pra quê falar 
 Se você não quer me ouvir?
 Fugir agora não resolve nada

如您所见,每个句子都拆分为新行。但是当我把歌词刮下来保存在一个csv文件中时,R会返回合并后的句子,如下:

 Output:
 Quando a chuva passarPra quê falarSe você não quer me ouvir?Fugir agora não resolve nada

这是我的代码:

library(rvest)
library(dplyr)

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

page <- read_html(link)

name_link_id <- page %>% html_nodes('.nameMusic') %>% html_attr("href")

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

get_lyrics <- function(lyrics_link){

lyric <- read_html(lyrics_link)

all_lyrics <- lyric %>% html_nodes('#lyrics') %>% html_text() 
return(all_lyrics)
}

lyr <- sapply(name_link_full, FUN = get_lyrics)

lyrs <- data.frame(lyr, stringsAsFactors = FALSE)

write.csv(lyrs, 'Ivete.Sangalo.csv')

我试过stringi()strsplit(),但没有任何改变。请问,我该如何解决这个问题?

【问题讨论】:

    标签: r csv web-scraping character


    【解决方案1】:

    以下函数读取数据并返回一个 data.frame,其中有一列名为 lyrics

    library(rvest)
    library(dplyr)
    
    get_lyrics <- function(lyrics_link){
      lyrics_link %>%
        read_html() %>%
        html_nodes('#lyrics') %>% 
        html_text2() %>%
        gsub("\\n\\n", "\n", .) %>%
        str_split(pattern = "\\n") %>%
        unlist() %>%
        as.data.frame() %>%
        `names<-`("lyrics")
    }
    link <- "https://www.vagalume.com.br/ivete-sangalo/"
    
    page <- read_html(link)
    
    name_link_full <- page %>% 
      html_nodes('.nameMusic') %>% 
      html_attr("href") %>%        
      paste("https://www.vagalume.com.br", ., sep = "")
    
    lyr <- lapply(name_link_full[1:5], FUN = get_lyrics)
    

    编辑

    按照下面的cmets,这里有两种将歌词写入文件的方法。

    首先,rbind 列表 lyr 的向量。并删除列标题。

    lyr <- lapply(name_link_full[1:5], FUN = get_lyrics)
    lyrs <- lapply(lyr, \(l) paste(unlist(l),  collapse = " "))
    lyrs <- do.call(rbind.data.frame, lyrs)
    names(lyrs) <- ''
    

    然后,写为 csv 和 txt。目录"~/tmp" 是可选的。

    old_dir <- getwd()
    setwd("~/tmp")
    write.csv(lyrs, 'Ivete.Sangalo.csv', quote = FALSE, row.names = FALSE)
    writeLines(unlist(lyrs), con = 'Ivete.Sangalo.txt')
    setwd(old_dir)
    

    【讨论】:

    • 嗨,@RuiBarradas,好。非常感谢您的友好回答。不幸的是,它仍然无法正常工作。
    • @CygnusX-1 你有什么问题?我和我一起工作,什么不适合你?
    • 你好,@RuiBarradas。对不起,我认为我不够明确。只是每个歌词必须保留在单个 csv 行中,并且没有名称“歌词”。只是简单的歌词。
    • @CygnusX-1 好的,您希望如何编写诗句,每行一个歌词,但诗句之间用空格隔开?如果是这样,为什么是 csv 格式? csv 文件有一个列标题,删除 "lyrics" 并替换为什么?
    • @CygnusX-1 如果你想要每行一个歌词,为什么不使用 writeLines 编写的纯 txt 文件?
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多