我是一个R初学者,我试图写一个功能,从一个网站上的某个歌手的所有歌词,返回与歌词和歌曲的名字。我已经设法得到所有的歌曲链接,但我被困在试图写一个功能,真正得到歌词。
有问题的网站是:https://www.letras.mus.br/belchior/44457/
歌曲标题选择器:#js-lyric-cnt > article > div.cnt-head.cnt-head--l > div.cnt-head_title > h1
歌词选择器:#js-lyric-cnt > article > div.cnt-letra-trad.g-pr.g-sp > div.cnt-letra.p402_premium
我写了这个函数:
get_lyrics <- function(url){
url %>% read_html() %>%
um <- html_nodes('#js-lyric-cnt > article > div.cnt-letra-trad.g-pr.g-sp > div.cnt-letra.p402_premium')
um %>%
lyrics <- html_text()
url %>% read_html() %>%
dois <- html_nodes('#js-lyric-cnt > article > div.cnt-head.cnt-head--l > div.cnt-head_title > h1')
dois %>%
title <- html_text()
data_frame(title, lyrics)
}但当我试图逃跑时我得到了:
get_lyrics('https://www.letras.mus.br/belchior/1391391/')
Error in UseMethod("xml_find_all") :
no applicable method for 'xml_find_all' applied to an object of class "character" 我不知道我能做些什么来解决这个问题,所以我很感激你的帮助。
发布于 2019-08-27 14:08:09
你可以缩短你的选择器(通常更快,更稳定)。read_html只使用一次检索到的内容。我假设(eek) -你想要一个数据,一个条目为标题和一个相应的条目为歌词。歌词位于带有类cnt-letra的父元素中的br标记中;此外,单独的抒情诗行是分开的br标记。为了在解析单个字符串时保留原始歌词行距的感觉,我添加了'\n‘来解释这些中断。
我从@rentrop br (@rentrop 这里 )中获得了解决缺乏rvest处理的必要功能--尽管这个问题已经很久了,也许我已经错过了这个特性的添加?
在链接方法以确保流程符合预期时,请注意使用的排序。
library(rvest)
library(magrittr)
html_text_collapse <- function(x, trim = FALSE, collapse = "\n"){
UseMethod("html_text_collapse")
}
html_text_collapse.xml_nodeset <- function(x, trim = FALSE, collapse = "\n"){
vapply(x, html_text_collapse.xml_node, character(1), trim = trim, collapse = collapse)
}
html_text_collapse.xml_node <- function(x, trim = FALSE, collapse = "\n"){
paste(xml2::xml_find_all(x, ".//text()"), collapse = collapse)
}
get_lyrics <- function(url){
page <- read_html(url)
lyrics <- toString(page %>% html_nodes('.cnt-letra p') %>% html_text_collapse)
title <- page %>% html_node('.cnt-head_title') %>% html_text()
return(data.frame(title, lyrics))
}
get_lyrics('https://www.letras.mus.br/belchior/44457/')发布于 2019-12-29 22:06:03
如果目标是得到歌词,你可以使用genius包。
genius::genius_lyrics("Belchior", "Na Hora do Almoco")会去取歌词。
https://stackoverflow.com/questions/57673610
复制相似问题