2016-07-07 1 views
0

현재이 웹 사이트의 데이터를 고칩니다. www.allmusic.com조건의 길이가 1보다 길고 첫 번째 요소 만 사용됩니다. 인수 문제

나는 이것을 통해 각 아티스트 페이지의 음악 스타일을 구체적으로 훑어보고 있습니다.

rm(list= ls()) 

library(xml2) 
library(rvest) 
library(magrittr) 
library(stringr) 
library(plyr) 
library(dplyr) 
library(tidyr) 
library(knitr) 
library(XML) 
library(data.table) 

setwd("~/AlbumScrape") 

load("popalbums2004-2014.rdata") 

pages <- popalbums2004-2014.rdata %>% slice(1:100) %>% 
    mutate(URL = paste0("http://www.allmusic.com/album/",album,"/credits")) 

credits_tmp = NULL 
albumAttrs_tmp = NULL 
album_genre_tmp = NULL 
album_style_tmp = NULL 
album_mood_tmp = NULL 
album_theme_tmp = NULL 

pb = txtProgressBar(min = 0, max = nrow(pages), initial = 0, char = "*",  style = 3) 

system.time(
    for(i in seq(nrow(pages))) { 

    return_value <- try({ 

    test403 <- read_html(paste0("http://www.allmusic.com/album /",pages$album[i],"/credits")) 
}) 

if(class(return_value) == "try-error"){ 
print("failed"); 
} else { 
print("succeeded") 

src_url <- pages$URL[i] %>% read_html() 

src_artist <- pages$src_artist[i] %>% 
    as.character() 

album <- pages$album[i] %>% 
    as.character() 

credits_artistURL <- try_default(
    expr = 
    src_url %>% 
    html_nodes(".artist a") %>% 
    html_attr("href") %>% 
    str_trim() %>% 
    gsub("http://www.allmusic.com/album/","",.), 
    default = "", quiet = T) 

credit_artistRole <- try_default(
    expr = 
    src_url %>% 
    html_nodes(".credit") %>% 
    html_text() %>% 
    str_trim(), 
    default = "", 
    quiet = TRUE) 


album_duration <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".duration span") %>% 
     html_text() %>% 
     str_trim(), 
    default = "", 
    quiet = TRUE) 

album_releaseDate <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".release-date span") %>% 
     html_text() %>% 
     str_trim(), 
    default = "", 
    quiet = TRUE) 

album_recordingDate <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".recording-date div") %>% 
     html_text() %>% 
     str_trim(), 
    default = "", 
    quiet = TRUE) 

album_genre <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".genre a") %>% 
     html_attr("href") %>% 
     str_trim() %>% 
     gsub("http://www.allmusic.com/genre/","",.), 
    default = "", 
    quiet = TRUE) 

album_style <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".styles a") %>% 
     html_attr("href") %>% 
     str_trim() %>% 
     gsub("http://www.allmusic.com/style/","",.), 
    default = "", 
    quiet = TRUE) 

album_mood <- 
    try_default(
    expr = 
     src_url %>% 
     html_nodes(".mood a") %>% 
     html_attr("href") %>% 
     str_trim() %>% 
     gsub("http://www.allmusic.com/mood/","",.), 
    default = "", 
    quiet = TRUE) 

album_theme <- 
    try_default(
    src_url %>% 
     html_nodes(".theme a") %>% 
     html_attr("href") %>% 
     str_trim() %>% 
     gsub("http://www.allmusic.com/theme/","",.), 
    default = "", 
    quiet = TRUE) 


credits_res_tmp <- try_default(
    expr = 
    data.frame(credits_artistURL = credits_artistURL, 
       credit_artistRole = credit_artistRole, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(credits_artistURL = "ERROR", 
       credit_artistRole = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) %>% 
    filter(., credits_artistURL != "#") 

data_credits_tmp = list(credits_tmp, credits_res_tmp) 
credits_tmp <- rbindlist(data_credits_tmp) 


albumAttrs_res_tmp <- try_default(
    expr = 
    data.frame(album_duration = album_duration, 
       album_releaseDate = album_releaseDate, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(album_duration = "ERROR", 
       album_releaseDate = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) 

data_albumAttrs_tmp = list(albumAttrs_tmp, albumAttrs_res_tmp) 
albumAttrs_tmp <- rbindlist (data_albumAttrs_tmp) 


album_genre_res_tmp <- try_default(
    expr = 
    data.frame(album_genre = album_genre, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(album_genre = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) 


data_album_genre_tmp = list(album_style_tmp, album_genre_res_tmp) 
album_genre_tmp <- rbindlist(data_album_genre_tmp) 



album_style_res_tmp <- try_default(
    expr = 
    data.frame(album_style = album_style, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(album_style = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) 


data_album_style_tmp = list(album_style_tmp, album_style_res_tmp) 
album_style_tmp <- rbindlist(data_album_style_tmp) 


album_mood_res_tmp <- try_default(
    expr = 
    data.frame(album_mood = album_mood, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(album_mood = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) 


data_album_mood_tmp = list(album_mood_tmp, album_mood_res_tmp) 
album_mood_tmp <- rbindlist (data_album_mood_tmp) 


album_theme_res_tmp <- try_default(
    expr = 
    data.frame(album_theme = album_theme, 
       src_artist = src_artist, album = album), 
    default = 
    data.frame(album_theme = "ERROR", 
       src_artist = src_artist, album = album), quiet = T) 

data_album_theme_tmp = list(album_theme_tmp, album_theme_res_tmp) 
album_theme_tmp <- rbindlist(data_album_theme_tmp) 

Sys.sleep(runif(1, 0.01, 0.05)) 

if(i %% 10 == 0) {setTxtProgressBar(pb, i)} 

}} 
) 

일부 결과가 표시되지만 일부 아티스트의 경우 스타일 입력란에 몇 가지 오류가 표시됩니다.

첫 번째 스크립트를 모방했지만 오류가 발생한 아티스트 만 저장 데이터 프레임을로드하는 별도의 스크립트를 만들었습니다.

스크립트는 그대로입니다.

그러나 이것을 사용한 후에, 나는 여전히 긁어 모으기에 오류가 발생했습니다.

1:In if (class(return_value) == "try-error") { ... : 
the condition has length > 1 and only the first element will be used 
2: In if (class(return_value) == "try-error") { ... : etc etc 

나는 문제가 이렇게 내 논리에 1 개 이상의 단위 길이를 작성, 예를 여러 필드가 http://www.allmusic.com/album/ultimate-darkness-mw0000481576/credits에 대해 다음과 같이 특정 웹 페이지에서 내 주장에서 유래 생각합니다.

스타일 필드를 수집 할 수 있도록 이러한 요소를 포함하도록 코드를 변경하는 방법을 잘 모르겠습니다.

답변

0

반환 개체에 둘 이상의 클래스가 있습니다. if()을 사용할 때 괄호 안의 표현식은 길이가 하나 인 논리 값 (또는 하나에 강제 변환 될 수있는 값)으로 평가되어야합니다. 클래스의 길이가 1보다 크면 길이가 1보다 큰 논리 값의 벡터를 얻게되어 경고이 표시됩니다. 예 :

foo <- 1:10 
class(foo) 
class(foo) <- c("myclass", class(foo)) 
class(foo) 
class(foo) == "myclass" 

> class(foo) 
[1] "integer" 
> class(foo) <- c("myclass", class(foo)) 
> class(foo) 
[1] "myclass" "integer" 
> class(foo) == "myclass" 
[1] TRUE FALSE 
> if(class(foo) == "myclass") { 
+ print("Yay!") 
+ } 
[1] "Yay!" 
Warning message: 
In if (class(foo) == "myclass") { : 
    the condition has length > 1 and only the first element will be used 

정확한 클래스 멤버쉽 테스트 방법은 클래스의 상속을 통한 방법입니다. 이는 inherits() 함수를 사용하여 수행됩니다.

> if(inherits(foo, "myclass")) { 
+ print("Yay!") 
+ } 
[1] "Yay!"