2011-02-03 13 views
1

私は、ページのHTMLテーブルを読むためにRのXMLパッケージを使用しています。 2.12.1で、私は次のエラーを取得しています:私は2.10に同じコードスニペットを実行したときに2.12のXMLパッケージエラー2.10でない

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

しかし、エラーとすべてのパース何が(ほぼ)罰金はありません。列名はテーブルの最初の行から取られているので、私はほとんど言いますが、私はそれを回避することができます。あなたが提供できるすべてのヘルプははるかに高く評価されます

## 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テーブルには2つの問題があります.1)最初のヘッダー行にはマージされた列が含まれ、2)ヘッダー行は繰り返されます。

これが最初のコードでエラーを返す原因になります。データ行は長さ19であるが、ヘッダーは長さ19と長さ5の2つの行、つまり合計24個で構成されている。それはあなたのエラーをスローするこの矛盾です。

このページは、readHTMLTable()関数を使用してスクレープできませんでした。しかし、ここで私の解決策は、スクレーパーとXMLのツールを使用している:

# 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 

コードは少し厄介であり、データの全てが文字ベクトルではなく、数値であるため、表には、きれいではありません。

少なくとも、これ以上処理できる形式のデータがあることを意味します。

関連する問題