6

次の URL のテーブルからデータを取得しようとしています。

http://www.nfpa.org/itemDetail.asp?categoryID=953&itemID=23033

問題は、

<sup> </sup>

タグ。次のコードを使用すると(確かにあまりエレガントではありません)

url.overview <- "http://www.nfpa.org/itemDetail.asp?categoryID=953&itemID=23033"
overview <- readHTMLTable(overview)
overview <- overview[[2]]
overview <- overview[-1,]

f <- function(x){
  out <- iconv(x, "latin1", "ASCII", sub="")
  out <- gsub('[\\$,]', '', out) 
  out <- as.numeric(out)
  return(out)
}

overview <- matrix(f(as.character(unlist(overview))), ncol = ncol(overview))
overview <- as.data.frame(overview)
names(overview) <- c('year', 'fires', 'civ.deaths', 'civ.injuries', 'ff.deaths',
                     'ff.injuries', 'damage.reported', 'damage.2010dollars')

上付き文字の値が表のセルの値の末尾に追加されることを除いて、まさに私が望むものを取得します。たとえば、(上記の URL の行と列の名前を使用して) 2001 年の民間人の死亡数は、上付き文字の 3 が余分な数字として解釈されるため、6196 である必要があるときに 61963 として格納されます。上付き文字がないテーブル内のセルはすべて、正確に正しく表示されます。

ドキュメントに何時間も苦労した後、関数を使用しparseHTMLgetNodeSetXML パッケージからタグを含むすべてのノードを特定<sup>できましたが、そこから何をすべきかわかりませんでした。

overview <- htmlParse(url.overview)
getNodeSet(overview, "//sup")

XMLツリーのこれらの部分をどうにかして削除し、結果をさらに処理するためにreadHTMLTableに戻す必要があると思いますが、これを行う方法がわかりませんでした。

あなたの考えにとても感謝しています。

4

1 に答える 1

5

試す

require(XML)
url.overview <- "http://www.nfpa.org/itemDetail.asp?categoryID=953&itemID=23033"
overview <- htmlParse(url.overview,encoding="UTF-8")
temp<-getNodeSet(overview, "/*//span[@class=\"small\"]/sup")
removeNodes(temp)
app.data<-readHTMLTable(overview)[[2]]

したがって、ここでは不要なノードを削除し、残りを 2 番目のテーブルに戻しreadHTMLTableます。この Windows ボックスのエンコードに問題がありました。エンコーディングをそのままにしておくhtmlParseか、なくても問題なく動作する場合があります。

于 2012-08-22T00:37:11.493 に答える