2017-06-02 11 views
0

以下のようなHTMLデータセットがあります。これを解析し、使用できる表形式に変換します。HTMLデータを解析するにはR

<!DOCTYPE html> 
<html> 

<head> 
    <title>Page Title</title> 
</head> 

<body> 
    <div class="brewery" id="brewery"> 
     <ul class="vcard simple"> 
      <li class="name"> Bradley Farm/RB Brew, LLC</li> 
      <li class="address">317 Springtown Rd </li> 
      <li class="address_2">New Paltz, NY 12561-3020 | <a href='http://www.google.com/maps/place/317 Springtown Rd++New Paltz+NY+United States' target='_blank'>Map</a> </li> 
      <li class="telephone">Phone: (845) 255-8769</li> 
      <li class="brewery_type">Type: Micro</li> 
      <li class="url"><a href="http://www.raybradleyfarm.com" target="_blank">www.raybradleyfarm.com</a> </li> 
     </ul> 
     <ul class="vcard simple col2"></ul> 
    </div> 
    <div class="brewery"> 
     <ul class="vcard simple"> 
      <li class="name">(405) Brewing Co</li> 
      <li class="address">1716 Topeka St </li> 
      <li class="address_2">Norman, OK 73069-8224 | <a href='http://www.google.com/maps/place/1716 Topeka St++Norman+OK+United States' target='_blank'>Map</a> </li> 
      <li class="telephone">Phone: (405) 816-0490</li> 
      <li class="brewery_type">Type: Micro</li> 
      <li class="url"><a href="http://www.405brewing.com" target="_blank">www.405brewing.com</a> </li> 
     </ul> 
     <ul class="vcard simple col2"></ul> 
    </div> 
</body> 

以下は私が使用したコードです。私が直面している問題は、Rvestを使ってテキストファイルに変換するのですが、それはどんな有用なフォーマットにもなりません。

library(dplyr) 
library(rvest) 

url<-html("beer.html") 
selector_name<-".brewery" 
fnames<-html_nodes(x = url, css = selector_name) %>% 
html_text() 
head(fnames) 
fnames 

これは正しいアプローチか、他のパッケージを使用して各divと内部要素を調べる必要がありますか。

うち、私はそれを見たい置く

No. Name Address Type Website 

はありがとうございました。

答えて

1
library(rvest) 
library(dplyr) 

html_file <- '<!DOCTYPE html> 
<html> 

<head> 
    <title>Page Title</title> 
</head> 

<body> 
    <div class="brewery" id="brewery"> 
     <ul class="vcard simple"> 
      <li class="name"> Bradley Farm/RB Brew, LLC</li> 
      <li class="address">317 Springtown Rd </li> 
      <li class="address_2">New Paltz, NY 12561-3020 | <a href="http://www.google.com/maps/place/317 Springtown Rd++New Paltz+NY+United States" target="_blank">Map</a> </li> 
      <li class="telephone">Phone: (845) 255-8769</li> 
      <li class="brewery_type">Type: Micro</li> 
      <li class="url"><a href="http://www.raybradleyfarm.com" target="_blank">www.raybradleyfarm.com</a> </li> 
     </ul> 
     <ul class="vcard simple col2"></ul> 
    </div> 
    <div class="brewery"> 
     <ul class="vcard simple"> 
      <li class="name">(405) Brewing Co</li> 
      <li class="address">1716 Topeka St </li> 
      <li class="address_2">Norman, OK 73069-8224 | <a href="http://www.google.com/maps/place/1716 Topeka St++Norman+OK+United States" target="_blank">Map</a> </li> 
      <li class="telephone">Phone: (405) 816-0490</li> 
      <li class="brewery_type">Type: Micro</li> 
      <li class="url"><a href="http://www.405brewing.com" target="_blank">www.405brewing.com</a> </li> 
     </ul> 
     <ul class="vcard simple col2"></ul> 
    </div> 
</body>' 

page <- read_html(html_file) 

tibble(
    name = page %>% html_nodes(".vcard .name") %>% html_text(), 
    address = page %>% html_nodes(".vcard .address") %>% html_text(), 
    type = page %>% html_nodes(".vcard .brewery_type") %>% html_text() %>% stringr::str_replace_all("^Type: ", ""), 
    website = page %>% html_nodes(".vcard .url a") %>% html_attr("href") 
) 

#> # A tibble: 2 x 4 
#>       name   address type      website 
#>       <chr>    <chr> <chr>       <chr> 
#> 1 Bradley Farm/RB Brew, LLC 317 Springtown Rd Micro http://www.raybradleyfarm.com 
#> 2    (405) Brewing Co 1716 Topeka St Micro  http://www.405brewing.com 
+1

おかげでたくさんの@austensen。私が得る私の唯一のエラーは、タイプ全体のファイルでこれを実行している間です。私たちが空白の型の値を置き換えようとしている間に何かすることになるでしょう。 'エラー:列' type'は長さ1または7263でなく7147でなければなりません。 ' – SNT

+0

実際のデータに 'type'フィールドがないいくつかの醸造所があります。データフレームの長さが異なります。私はそれを解決する方法についてもう少し考えなければならないだろう。 – austensen

1

問題はテーブルではないため、解析するのが簡単ではないということです。これは2つのリストで、以下のコードが1つのリストに連結されています。また、FYIについては、html/xmlを解析するためのxml2パッケージを調べてみてください。

library(dplyr) 
library(rvest) 
library(xml2) 

vcard <- 
    '<!DOCTYPE html> 
    <html> 

    <head> 
    <title>Page Title</title> 
    </head> 

    <body> 
    <div class="brewery" id="brewery"> 
    <ul class="vcard simple"> 
    <li class="name"> Bradley Farm/RB Brew, LLC</li> 
    <li class="address">317 Springtown Rd </li> 
    <li class="address_2">New Paltz, NY 12561-3020 | <a href=\'http://www.google.com/maps/place/317 Springtown Rd++New Paltz+NY+United States\' target=\'_blank\'>Map</a> </li> 
    <li class="telephone">Phone: (845) 255-8769</li> 
    <li class="brewery_type">Type: Micro</li> 
    <li class="url"><a href="http://www.raybradleyfarm.com" target="_blank">www.raybradleyfarm.com</a> </li> 
    </ul> 
    <ul class="vcard simple col2"></ul> 
    </div> 
    <div class="brewery"> 
    <ul class="vcard simple"> 
    <li class="name">(405) Brewing Co</li> 
    <li class="address">1716 Topeka St </li> 
    <li class="address_2">Norman, OK 73069-8224 | <a href=\'http://www.google.com/maps/place/1716 Topeka St++Norman+OK+United States\' target=\'_blank\'>Map</a> </li> 
    <li class="telephone">Phone: (405) 816-0490</li> 
    <li class="brewery_type">Type: Micro</li> 
    <li class="url"><a href="http://www.405brewing.com" target="_blank">www.405brewing.com</a> </li> 
    </ul> 
    <ul class="vcard simple col2"></ul> 
    </div> 
    </body>' %>% 
    read_html(html) %>% 
    xml_find_all("//ul[@class = 'vcard simple']") 

two_children <- sapply(vcard, function(x) xml2::xml_children(x)) 

data.frame(
    class = sapply(two_children, function(x) xml2::xml_attrs(x)), 
    value = sapply(two_children, function(x) xml2::xml_text(x)), 
    stringsAsFactors = FALSE 
)