10

私は自分の質問に対する答えをしばらく探していました。thisthisthis 、および関連する他のいくつかを読みましたが、まだ回答が得られません。

私の問題は非常に単純ですが (そうであることを願っています)、答えは (少なくとも私自身にとっては) ではありません。毎月測定されるニカラグアの経済活動の指標である経済データをこのWeb からインポートしたいと考えています。これを試しました:

library(XML)
u <- "http://www.bcn.gob.ni/estadisticas/trimestrales_y_mensuales/siec/datos/4.IMAE.htm"
u <- htmlParse(u,encoding="UTF-8")
imae <- readHTMLTable(doc=u, header=T)
imae

library(httr)
u2 <- "http://www.bcn.gob.ni/estadisticas/trimestrales_y_mensuales/siec/datos/4.IMAE.htm"
page <- GET(u2, user_agent("httr"))
x <- readHTMLTable(text_content(page), as.data.frame=TRUE)

あなたが想像できるように成功しませんでした。コードの最初のチャンクでこの出力が得られました

   $`NULL`
                                  BANCO CENTRAL DE NICARAGUA    NA    NA    NA   NA   NA   NA   NA   NA   NA   NA    NA    NA       NA
1                                                             <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>
2 <U+633C><U+3E64>ndice Mensual de Actividad Económica(IMAE)  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>
3                                           (Base: 1994=100)  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>
4                                                             <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>
5                                                        Año   Ene   Feb   Mar  Abr  May  Jun  Jul  Ago  Sep  Oct   Nov   Dic Promedio
6                                                             <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>
7                                                       1994 101.6 107.6 100.1 95.7 94.7 92.8 92.1 96.8 98.5 97.4 101.7 121.1    100.0
8                                               Fuente: BCN.  <NA>  <NA>  <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>  <NA>  <NA>     <NA>

使用してみskip.rows=1:5ましたが、あまりにも多くの主な結果は実際には変わりませんNA。この質問に光を当てることができる人はいますか?

期待される結果は、この Webに示されている情報を含む data.frame です。

4

2 に答える 2

10

コメントで述べたように、コード化されたテーブルが不十分なために問題が発生する可能性が最も高いです。

次のようなアプローチを試すことができます (RStudio を使用して Ubuntu でテスト済み)。wgethtml tidyがインストールされている必要があります。これらの便利なプログラムをインストールしたくない場合は、この回答の更新された部分にジャンプしてください。

  1. ページをダウンロードして「片付け」ます。

    system("wget http://www.bcn.gob.ni/estadisticas/trimestrales_y_mensuales/siec/datos/4.IMAE.htm")
    system("tidy 4.IMAE.htm > new.html")
    
  2. 通常どおり R を続行します。

    library(XML)
    u <- htmlParse("new.html")
    imae <- readHTMLTable(u)
    
  3. 上記の出力を表示するreadHTMLTableと、いくつかの行をスキップする必要があることがわかります。もう一度実行してみましょう:

    imae <- readHTMLTable(u, skip.rows=c(1:5, 7, 27, 28), header=TRUE)
    imae
    # $`NULL`
    #     Año   Ene   Feb   Mar   Abr   May   Jun   Jul   Ago   Sep   Oct   Nov   Dic Promedio
    # 1  1994 101.6 107.6 100.1  95.7  94.7  92.8  92.1  96.8  98.5  97.4 101.7 121.1    100.0
    # 2  1995 113.2 105.0 113.6  98.0 100.9  95.4  99.8 101.5 108.3 107.1 107.6 133.2    107.0
    # 3  1996 123.6 116.0 109.1 107.3  94.8 101.2 100.7 115.3 110.6 112.7 117.5 137.7    112.2
    # 4  1997 133.4 115.9 117.4 118.8 120.4 108.2 107.4 111.1 120.3 117.7 119.5 142.3    119.4
    # 5  1998 131.4 120.4 127.9 118.4 130.2 116.5 122.1 129.7 127.3 127.5 112.7 156.6    126.7
    # 6  1999 146.0 139.6 146.9 134.8 140.6 131.8 130.6 128.3 128.9 131.8 142.7 172.6    139.5
    # 7  2000 157.8 142.1 147.3 138.5 137.7 135.7 128.9 131.2 141.7 143.0 156.6 191.2    146.0
    # 8  2001 163.3 143.8 154.8 141.5 147.6 134.0 135.7 143.3 138.2 138.8 145.3 187.3    147.8
    # 9  2002 152.1 144.7 143.3 142.1 143.1 131.9 136.1 145.7 146.4 147.8 157.5 185.0    148.0
    # 10 2003 159.3 151.4 149.1 142.7 139.7 139.1 145.6 147.8 154.9 158.4 157.8 195.7    153.5
    # 11 2004 172.8 157.1 166.9 153.6 161.2 150.5 155.3 153.3 156.6 155.6 167.7 213.0    163.6
    # 12 2005 183.1 170.6 173.6 158.7 160.8 158.5 158.8 168.7 165.8 165.4 178.4 218.8    171.8
    # 13 2006 187.7 177.8 185.6 161.8 166.4 163.2 164.7 175.1 175.1 185.3 189.6 231.2    180.3
    # 14 2007 200.1 184.1 196.5 180.1 169.7 171.4 181.6 180.9 173.0 182.8 202.0 236.7    188.2
    # 15 2008 205.4 194.4 193.1 205.9 171.0 174.8 181.3 190.7 183.1 182.7 182.5 244.7    192.5
    # 16 2009 195.7 191.0 190.8 177.0 168.1 172.6 179.2 185.6 178.9 181.4 191.3 241.4    187.7
    # 17 2010 195.2 193.7 205.1 185.2 179.3 190.1 191.6 190.0 193.5 197.6 210.9 266.0    199.8
    # 18 2011 213.9 207.4 217.3 198.7 196.1 198.8 191.9 210.0 203.7 207.9 217.3 274.5    211.5
    # 19 2012 233.6                                                                      233.6
    

更新: 役立つ小さな機能

アクセント付き文字のテキストのクリーンアップを行う必要があることに耐えられる場合は、W3Cが html tidy のオンライン実装を提供しています。これにより、次のような基本的な関数を作成できます。

tidyHTML <- function(URL) {
  require(XML)
  URL = gsub("/", "%2F", URL)
  URL <- gsub(":", "%3A", URL)
  URL <- paste("http://services.w3.org/tidy/tidy?docAddr=", URL, sep = "")
  htmlParse(URL)
}

使い方は簡単です:

u <- tidyHTML("http://www.bcn.gob.ni/estadisticas/trimestrales_y_mensuales/siec/datos/4.IMAE.htm")
readHTMLTable(u)
于 2012-10-06T16:48:26.130 に答える
6

これは、リンク先の他の応答のようにテーブルが十分に構造化されていない場合に機能するちょっとしたハック ジョブです。しかし、実際には、フォーマットが変更されていない場合に機能するのは 1 回限りですが、注意が必要です。危険を伴う可能性があります。人々が追加できる、より一般的なソリューションが存在する可能性があります。

require(RCurl)
require(XML)
u <- "http://www.bcn.gob.ni/estadisticas/trimestrales_y_mensuales/siec/datos/4.IMAE.htm"

webpage <- getURL(u)
lines <- readLines(tc <- textConnection(webpage)); close(tc)
pagetree <- htmlTreeParse(lines, error=function(...){}, useInternalNodes = TRUE)

# parse tree by any tables
x <- xpathSApply(pagetree, "//*/table", xmlValue)  

# remove white space and such w/ regexes
unlisted <- unlist(strsplit(x, "\n"))
notabs <- gsub("\t","",unlisted)
nowhitespace <- sub("^[[:space:]]*(.*?)[[:space:]]*$", "\\1", notabs, perl=TRUE)
data <- nowhitespace[!(nowhitespace %in% c("", "|"))]

ここに危険な部分があります:

months<-data[5:16]
data_out<-data[18:(length(data)-4)] #omits 2012 data to easily fit structure argument

finalhack<-data.frame(t(structure(
data_out,dim = c(14,18),.Dimnames =     
list(c('year',months,'index'),seq(1994,2011)))))
于 2012-10-05T21:13:40.167 に答える