【问题标题】:rvest, How to have NA values in html_nodes for creating datatablesrvest,如何在 html_nodes 中使用 NA 值来创建数据表
【发布时间】:2018-07-14 07:59:03
【问题描述】:

所以我试图在网站上制作一些信息的数据表。这是我到目前为止所做的。

library(rvest)
url <- 'https://uws-community.symplicity.com/index.php?s=student_group'
page <- html_session(url)

name_nodes <- html_nodes(page,".grpl-name a")
name_text <- html_text(name_nodes)

df <- data.frame(matrix(unlist(name_text)), stringsAsFactors = FALSE)

library(tidyverse)
df <- df %>% mutate(id = row_number())

desc_nodes <- html_nodes(page, ".grpl-purpose")
desc_text <- html_text(desc_nodes)

df <- left_join(df, data.frame(matrix(unlist(desc_text)), 
                               stringsAsFactors = FALSE) %>% 
                  mutate(id = row_number()))

email_nodes <- html_nodes(page, ".grpl-contact a")

email_text <- html_text(email_nodes)
df <- left_join(df, data.frame(matrix(unlist(email_text)), 
                               stringsAsFactors = FALSE) %>% 
                  mutate(id = row_number()))

这一直有效,直到我进入电子邮件部分。一些条目没有电子邮件。在数据框中,最后三行显示的是 NA 值,而不是显示电子邮件的 NA 值的相应行。

如何使适当的行显示具有 NA 值,而不仅仅是最后 3 行?

【问题讨论】:

    标签: r web-scraping data-science rvest


    【解决方案1】:

    解决这个问题的关键是找到每个学生组已知存在的20个父节点。使用此父节点列表,在每个父节点上使用 html_node 函数。 html_node 函数将返回一个结果或 NA,具体取决于所需的标签是否存在。我会推荐这种技术,只要有可变数量的子节点。

    library(rvest)
    library(dplyr)
    url <- 'https://uws-community.symplicity.com/index.php?s=student_group'
    page <- html_session(url)
    
    #find group names
    name_text <- html_nodes(page,".grpl-name a") %>% html_text()
    df <- data.frame(name_text, stringsAsFactors = FALSE)
    df <- df %>% mutate(id = row_number())
    
    #find text description
    desc_text <- html_nodes(page, ".grpl-purpose") %>% html_text()
    df$desc_text <- trimws(desc_text)
    
    #find emails
    #  find the parent nodes with html_nodes
    #  then find the contact information from each parent using html_node
    email_nodes<-html_nodes(page, "div.grpl-grp") %>% html_node( ".grpl-contact a") %>% html_text()
    df$emails<-email_nodes
    

    我还借此机会简化了您的代码,因为列表都是 20 个元素长,所以 unlist/matrix/mutate 函数没有理由将额外的列添加到数据框中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2022-10-13
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多