2017-06-02 10 views
0

私はいくつかのli要素を内部に持つhtmlを解析しようとしています。これは2つのdivで保持しているhtmlサンプルです。私は約7000のdivsを解析する必要があります。 divのすべてがその中にli要素をすべて持っているわけではありません。 <li class="brewery_type">は、すべての部門で利用できるわけではありません。そのため、このコードでは、すべての値をtibbleに取り込むことはできません。その場合、どうやってこれを解析し、そのdiv内の欠落しているli要素をNAに置き換えることができますか?RESTで不足しているhtml_nodesをR内で置き換えます

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") 
) 

答えて

1

代わりワンパスでのタグの全てを解析する、Iは、要素/ノードのリストにdiv.breweryを構文解析し、次に個々の醸造所から要求された情報を抽出します。効率的ではありませんが、各親に関連する情報を追跡します。このモデルでは、親あたり1つの子要素しかないと仮定しています。したがって、部門ごとのウェブサイトは1つだけです。

library(rvest) 

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="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) 

breweries<-page %>% html_nodes("div.brewery") 

name<- breweries %>% html_node(".vcard .name") %>% html_text() 
address<- breweries %>% html_node(".vcard .address") %>% html_text() 
type<- breweries %>% html_node(".vcard .brewery_type") %>% html_text() 
type<-gsub("^Type: ", "", type) 
website<- breweries %>% html_node(".vcard .url a") %>% html_text() 

tibble(name, address, type, website) 
関連する問題