rvest,如何在html_nodes中具有NA值以创建数据表

时间:2018-07-14 07:59:03

标签: r web-scraping data-science rvest

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

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行?

1 个答案:

答案 0 :(得分:1)

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

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函数将额外的列添加到数据帧中。