【问题标题】:How to fix ' Error in UseMethod("xml_find_all") ' while trying to webscrape using rvest尝试使用 rvest 进行网络抓取时如何修复“UseMethod("xml_find_all") 中的错误”
【发布时间】:2019-08-27 11:23:12
【问题描述】:

我是 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" 

我不确定我能做些什么来解决它,所以我很感激你的帮助。

【问题讨论】:

    标签: r xml web-scraping rstudio rvest


    【解决方案1】:

    您可以缩短选择器(通常更快、更稳定)。 read_html 只使用一次,然后使用检索到的内容。我假设(eek) - 你想要一个数据框,其中包含 1 个标题条目和 1 个对应的歌词条目。歌词在类cnt-letra的父元素内的p标签内;此外,个别歌词行以br 标记分隔。为了在解析为单个字符串时保留原始歌词行间距的感觉,我添加了 '\n' 来解释这些中断。

    我从@rentrop here 获得了解决rvest 中缺少br 处理的必要功能-尽管这个问题已经很老了,也许我错过了添加此功能?

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

    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/')
    

    【讨论】:

      【解决方案2】:

      如果目标只是获取歌词,您可以使用 genius 包。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多