2011-02-03 5 views
1

R에서 XML 패키지를 사용하여 페이지에서 HTML 테이블을 읽습니다. 나는 2.10에서 동일한 코드를 실행할 때2.12에서 XML 패키지 오류가 있지만 2.10이 아닙니다.

Error in names(ans) = header : 
    'names' attribute [24] must be the same length as the vector [19] 

그러나, 오류 및 (거의) 미세 모든 파싱이 없습니다 : 2.12.1, 나는 다음과 같은 오류를 얻고있다. 열 이름이 테이블의 첫 번째 행에서 가져온 것이기 때문에 나는 거의 말합니다. 그러나 나는 그걸 해결할 수 있습니다. 당신이 제공 할 수있는 어떤 도움이 많이 이해할 수있을 것이다

## load the libraries 
library(XML) 

## set the season 
SEASON <- "2011" 

## create the URL 
URL <- paste("http://www.hockey-reference.com/leagues/NHL_", SEASON, "_goalies.html", sep="") 

## grab the page -- the table is parsed nicely -- why work 2.10, but not 2.12.1? 
tables <- readHTMLTable(URL) 

:

여기 내 코드입니다.

답변

1

v2.12.1로 이동했기 때문에이 문제가 발생하는지 확실하지 않습니다. 나는 2.12.1에 그것을 시도하고 동일한 오류가 발생합니다.

그러나 HTML의 내용이 변경 되었기 때문에 오류가 발생할 수도 있습니다. 나는 그 페이지에서 HTML 소스를 살펴 봤는데 테이블이 잘 형성되지는 않았다. HTML 표에는 두 가지 문제점이 있습니다. 1) 첫 번째 머리글 행에 병합 된 열이 있고 2) 머리글 행이 반복됩니다.

코드가 오류를 반환하는 것은 처음입니다. 데이터 행의 길이는 19이지만 헤더는 길이가 19이고 길이가 5 인 두 개의 행, 즉 총 24 개로 구성됩니다. 오류가 발생하는 것은이 불일치입니다.

readHTMLTable() 함수를 사용하여이 페이지를 다듬을 수 없었습니다.

# load the libraries 
library(XML) 
library(scrapeR) 
library(plyr) 
library(stringr) 

# scrape and parse page 
page <- scrape(url=URL, parse=TRUE) 
raw <- xpathSApply(page[[1]], "//table//tr", xmlValue) 
# split strings at each line break 
rows <- strsplit(raw, "\n") 
# now check for longest row length, and discard all short rows 
rowlength <- (laply(rows, length)) 
rows <- rows[rowlength==max(rowlength)] 
# unlist each row 
rows <- laply(rows, function(x)unlist(x)) 
# trim white space 
rows <- aaply(rows, c(1,2), str_trim) 
# convert to data frame 
df <- as.data.frame(rows, stringsAsFactors = FALSE) 
# read names from first row 
names(df) <- laply(df[1, ], str_trim) 
# remove all rows without a numerix index 
df <- df[which(!is.na(as.numeric(df$Rk))), ] 
df 

코드는 조금 지저분하고, 데이터의 모든 문자 벡터이기 때문에 테이블이 아니라 숫자보다 깨끗한되지 않습니다 : 그러나 여기 스크레이퍼 도구 및 XML을 사용하여 내 솔루션입니다.

적어도 이것은 처리 할 수있는 형식의 데이터를 가지고 있음을 의미합니다.

관련 문제