【问题标题】:Replace missing html_nodes while using rvest in R在 R 中使用 rvest 时替换缺少的 html_nodes
【发布时间】:2017-11-04 07:12:54
【问题描述】:

我正在尝试解析其中包含一些 li 元素的 html。这只是我保存的两个 div 的示例 html。我有将近 7000 个 div 需要解析。并非所有 div 都包含所有 li 元素。例如。 <li class="brewery_type"> 可能并非在所有 div 中都可用。因此,此代码将无法将所有值填充到 tibble 中。在那种情况下,我该如何解析并用 NA 替换该 div 中缺少的 li 元素。

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

【问题讨论】:

    标签: html r html-parsing rvest


    【解决方案1】:

    我没有一次性解析所有标签,而是将 div.brewery 解析为元素/节点列表,然后分别从每个啤酒厂提取请求的信息。效率不高,但它会跟踪每个父母的相关信息。该模型假设每个父元素只有一个子元素。因此每个 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2022-10-13
      • 2017-08-19
      相关资源
      最近更新 更多