2

Rを使用してWebサイト(www.majidata.co.ke)からデータをスクレイピングしようとしています(かなり失敗しました).必要!

ライブラリを使用して、次のXMLコードを使用してデータをスクレイピングします。

majidata_get <- GET("http://www.majidata.go.ke/town.php?MID=MTE=&SMID=MTM=")
majidata_html <- htmlTreeParse(content(majidata_get, as="text"))

これにより、(Large) XMLDocumentContent が残ります。Web ページにはドロップダウン リストがあり、そこから値を取得したいと考えています (これは、さまざまな町の名前と ID 番号に関連しています)。抽出したいビットは、数字<option value ="XXX">とそれに続く大文字の名前です。

<div class="regiondata">
       <div id="town_data">
        <select id="town" name="town" onchange="town_data(this.value);">
         <option value="0" selected="selected">[SELECT TOWN]</option>
         <option value="611">AHERO</option>
         <option value="635">AKALA</option>
         <option value="625">AWASI</option>
         <option value="628">AWENDO</option>
         <option value="749">BAHATI</option>
         <option value="327">BANGALE</option>

理想的には、これらを data.frame に入れたいと思います。最初の列は番号で、2 番目の列は名前です。

ID       Name
611      AHERO
635      AKALA
625      AWASI

ここからどこへ行けばいいのかよくわかりません。正規表現を使用してテキスト内のパターンに一致させることを考えていましたが、多くのフォーラムから、これは悪い考えであり、xpath を使用する方が優れている/より効率的であると読みました。xpathApplyどういうわけか使用する必要があると考える以外は、これをどこから始めればよいかよくわかりません。

4

2 に答える 2

5

非常に新しいrvestパッケージは、これをすばやく処理し、適切な CSS セレクターも使用できるようにします。

UPDATED 2 番目の要求を組み込みます (以下のコメントを参照)

library(rvest)
library(dplyr)

# gets data from the second popup
# returns a data frame of town_id, town_name, area_id, area_name
addArea <- function(town_id, town_name) {

  # make the AJAX URL and grab the data
  url <- sprintf("http://www.majidata.go.ke/ajax-list-area.php?reg=towns&type=projects&id=%s",
                 town_id)
  subunits <- html(url)

  # reformat into a data frame with the town data
  data.frame(town_id=town_id,
             town_name=town_name,
             area_id=subunits %>% html_nodes("option") %>% html_attr("value"),
             area_name=subunits %>% html_nodes("option") %>% html_text(),
             stringsAsFactors=FALSE)[-1,]

}

# get data from the first popup and put it into a dat a frame
majidata <- html("http://www.majidata.go.ke/town.php?MID=MTE=&SMID=MTM=")
maji <- data.frame(town_id=majidata %>% html_nodes("#town option") %>% html_attr("value"),
                   town_name=majidata %>% html_nodes("#town option") %>% html_text(),
                   stringsAsFactors=FALSE)[-1,]

# pass in the name and id to our addArea function and make the result into
# a data frame with all the data (town and area)
combined <- do.call("rbind.data.frame",
                    mapply(addArea, maji$town_id,  maji$town_name,
                           SIMPLIFY=FALSE, USE.NAMES=FALSE))

# row names aren't super-important, but let's keep them tidy
rownames(combined) <- NULL

str(combined)

## 'data.frame':    1964 obs. of  4 variables:
##  $ town_id  : chr  "611" "635" "625" "628" ...
##  $ town_name: chr  "AHERO" "AKALA" "AWASI" "AWENDO" ...
##  $ area_id  : chr  "60603030101" "60107050201" "60603020101" "61103040101" ...
##  $ area_name: chr  "AHERO" "AKALA" "AWASI" "ANINDO" ...


head(combined)

##   town_id town_name     area_id area_name
## 1     611     AHERO 60603030101     AHERO
## 2     635     AKALA 60107050201     AKALA
## 3     625     AWASI 60603020101     AWASI
## 4     628    AWENDO 61103040101    ANINDO
## 5     628    AWENDO 61103050401      SARE
## 6     749    BAHATI 73101010101    BAHATI
于 2014-09-22T03:24:26.117 に答える
3

HTML で xpath 式を使用することは、ほとんどの場合、正規表現よりも優れた選択です。このデータがあれば、目的のものを抽出できます

options<-getNodeSet(xmlRoot(majidata_html), "//select[@id='town']/option")

ids <- sapply(options, xmlGetAttr, "value")
names <- sapply(options, xmlValue)

data.frame(ID=ids, Name=names)

返す

   ID          Name
1   0 [SELECT TOWN]
2 611         AHERO
3 635         AKALA
4 625         AWASI
5 628        AWENDO
6 749        BAHATI
...
于 2014-09-22T02:54:20.323 に答える