首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复UseMethod("xml_find_all")中的‘错误’?

如何修复UseMethod("xml_find_all")中的‘错误’?
EN

Stack Overflow用户
提问于 2019-08-27 11:23:12
回答 2查看 2.4K关注 0票数 2

我是一个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

我写了这个函数:

代码语言:javascript
运行
复制
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)
}

但当我试图逃跑时我得到了:

代码语言:javascript
运行
复制
 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" 

我不知道我能做些什么来解决这个问题,所以我很感激你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-27 14:08:09

你可以缩短你的选择器(通常更快,更稳定)。read_html只使用一次检索到的内容。我假设(eek) -你想要一个数据,一个条目为标题和一个相应的条目为歌词。歌词位于带有类cnt-letra的父元素中的br标记中;此外,单独的抒情诗行是分开的br标记。为了在解析单个字符串时保留原始歌词行距的感觉,我添加了'\n‘来解释这些中断。

我从@rentrop br (@rentrop 这里 )中获得了解决缺乏rvest处理的必要功能--尽管这个问题已经很久了,也许我已经错过了这个特性的添加?

在链接方法以确保流程符合预期时,请注意使用的排序。

代码语言:javascript
运行
复制
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/')
票数 1
EN

Stack Overflow用户

发布于 2019-12-29 22:06:03

如果目标是得到歌词,你可以使用genius包。

genius::genius_lyrics("Belchior", "Na Hora do Almoco")会去取歌词。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57673610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档