【问题标题】:quirky behavoir with rvest wikipedia scrapingrvest 维基百科抓取的古怪行为
【发布时间】:2015-09-25 22:34:16
【问题描述】:

对不起,这是一个奇怪的问题,但我自己似乎无法弄清楚。好消息是:我认为它完全可以重现。

我正在尝试构建一个简单的 R 函数来使用 {rvest} 为音乐家的家乡抓取维基百科。基本上,我写的函数可以工作,但是对于某些艺术家来说,它不起作用(返回NULL)。 (兰迪纽曼就是这样一个人,所以我会以他为例。)

当我只运行整个事情(如下)然后findHome("randy newman") 我得到NULL 但是当我尝试调试时,我运行tableMusic() 函数然后artist <- "randy newman" 然后运行所有胆量artistData() 函数逐行运行,它可以工作!

然后,一旦我这样做了,我可以运行findHome("randy newman"),它会正常工作。是什么赋予了?!我有什么东西顺序错误吗?我好像搞不懂。

非常感谢任何帮助。代码如下:

library(rvest)
findHome <- function(artist) {
##function to look for the table with the right info
tableMusic <- function(data) {
    if(!any(grepl("years active|labels|instruments", data[,1], ignore.case=T))) {
        for (i in 2:5) {
            data <- try(url %>% html %>% html_nodes(xpath=paste('//*[@id="mw-content-text"]/table[', i, ']', sep="")) %>% html_table(fill=T), silent=T)
            if(!class(data)=="try-error" & length(data)>0) {
                if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
                if(any(grepl("years active|labels|instruments", data[,1], ignore.case=T))) {
                    break
                }
            }
        }
    }
    if(class(data)=="try-error" | length(data)<1) {
        data <- NULL
    } else if (!any(grepl("years active|labels|instruments", data[,1], ignore.case=T))) {
        data <- NULL
    }
    data
}
#function to pull data and try different pages if the first is wrong
artistData <- function(artist) {
    artist <- gsub(" ", "_", artist)
    artist <- gsub("'", "%27", artist)
    ##first try getting the data
    url <- paste("https://en.wikipedia.org/wiki/", artist, sep="")
    data <- try(url %>% html %>% html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>% html_table(fill=T), silent=T)
    ##check if it's the right page (deal with disambiguation issues)
    if(!class(data)=="try-error" & length(data)>0) {
        if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
        data <- tableMusic(data)
    }
    ## if try-error or musicTable==NULL, try _(band)
    if(class(data)=="try-error" | is.null(data) | length(data)<1) {
        url <- paste("https://en.wikipedia.org/wiki/", artist, "_(band)", sep="")
        data <- try(url %>% html %>% html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>% html_table(fill=T), silent=T)
        if(class(data)=="try-error"){
            data <- NULL
        } else {
            if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
            data <- tableMusic(data)
        }
    } else {
        if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
    }
    ## if try-error or musicTable==NULL, try _(musician)
    if(class(data)=="try-error" | is.null(data) | length(data)<1) {
        url <- paste("https://en.wikipedia.org/wiki/", artist, "_(musician)", sep="")
        data <- try(url %>% html %>% html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>% html_table(fill=T), silent=T)
        if(class(data)=="try-error"){
            data <- NULL
        } else {
            if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
            data <- tableMusic(data)
        }
    } else {
        if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
    }
    data
}
## first try finding data
data <- artistData(artist)
## try finding with and/&
if(is.null(data)){data <- artistData(unlist(strsplit(artist, " and| &"))[1])}
## if no matches return ""
if(class(data)=="try-error" | is.null(data)) {
    data <- ""
    return()
} else {
    if(class(data)!="data.frame") {data <- data.frame(data, stringsAsFactors=F)}
}

## if we have a matching page, pull the relevant data
origin <- data[data[,1]=="Origin",2]
if(length(origin)>0) {
    home <- origin
} else {
    born <- data[data[,1]=="Born",2]
    if (length(born)>0) {
        home <- unlist(strsplit(born, "age.[0-9]+)"))[2]
    } else {
        home <- ""
    }
}
home
}

findHome("randy newman")

【问题讨论】:

  • 跟昵称有关吗?还是缺少下划线?

标签: r web-scraping wikipedia rvest


【解决方案1】:

我想通了。我必须在tableMusic() 函数中添加一个url 参数。事实上,它从过去的搜索中回收了 url。谢谢你的建议。

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2019-05-24
    • 2017-04-30
    • 2020-07-20
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多