2017-06-02 2 views
0

J'essaye d'analyser un html qui a quelques éléments de li à l'intérieur d'eux. C'est juste un échantillon html que j'ai gardé avec deux divs. J'ai presque 7000 divs à analyser. Pas tous les divs ont tous les li éléments en eux.Pour par exemple. <li class="brewery_type"> peut ne pas être disponible dans tous les divs. En raison de cela, ce code ne sera pas capable de remplir toutes les valeurs dans le fichier. Dans ce cas, comment puis-je toujours analyser cela et remplacer les éléments li manquants dans cette div avec NA.Remplacer html_nodes manquant lors de l'utilisation rvest dans 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") 
) 

Répondre

1

Au lieu d'analyser toutes les balises en un seul passage, j'analysables la div.brewery dans une liste des éléments/noeuds, puis extrait les informations demandées à chaque brasserie individuellement. Pas aussi efficace mais il suit les informations pertinentes à chaque parent. Ce modèle suppose un seul élément enfant par parent. Ainsi, un seul nom, adresse, site Web par div.brewery

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)