R 从刮取的字符向量创建数据帧

R 从刮取的字符向量创建数据帧,r,web-scraping,html-parsing,rvest,R,Web Scraping,Html Parsing,Rvest,我正在尝试创建一个包含以下列的数据框:名字、姓氏、政党、州、成员ID library('rvest') candidate_url <- 'https://www.congress.gov/help/field-values/member-bioguide-ids' candidate_page <- read_html(candidate_url) candidate_nodes <- html_nodes(candidate_page, 'table') candidat

我正在尝试创建一个包含以下列的数据框:名字、姓氏、政党、州、成员ID

library('rvest')

candidate_url <- 'https://www.congress.gov/help/field-values/member-bioguide-ids'
candidate_page <- read_html(candidate_url)
candidate_nodes <- html_nodes(candidate_page, 'table')
candidate_list <- html_text(candidate_nodes)
library('rvest')

候选人试一试。我已经更新了它,包括分离不同的字段

library('rvest')
library('dplyr')
library('tidyr')

candidate_url <- 'https://www.congress.gov/help/field-values/member-bioguide-ids'
candidate_page <- read_html(candidate_url)
candidate_nodes <- html_nodes(candidate_page, 'table')
df.candidates <- as.data.frame(html_table(candidate_nodes, header = TRUE, fill = TRUE), stringsAsFactors = FALSE)
df.candidates <- df.candidates[!is.na(df.candidates$Member),]

df.candidates <- df.candidates %>%
                 mutate(Party.State = gsub("[\\(\\)]", "", regmatches(Member, gregexpr("\\(.*?\\)", Member))[[1]])) %>%
                 separate(Party.State, into = c("Party","State"), sep = " - ") %>%
                 mutate(Full.name = trimws(regmatches(df.candidates$Member, regexpr("^[^\\(]+", df.candidates$Member)))) %>%
                 separate(Full.name, into = c("Last.Name","First.Name","Suffix"), sep = ",", fill = "right") %>%
                 select(First.Name, Last.Name, Suffix, Party, State, Member.ID)
library('rvest')
库('dplyr')
图书馆('tidyr')

由于您有一个HTML表格,请使用
HTML表格
将其提取到data.frame。您需要
fill=TRUE
,因为该表在每个条目之间插入了额外的空行,您可以在以后使用
tidyr::drop\u na
轻松删除这些空行

库(tidyverse)
图书馆(rvest)
页数%
read_html()
成员%
html_节点('表')%>%
html_表格(fill=TRUE)%>%
设置_名称('member','bioguide')%>%
drop_na(成员)%>%#删除表中插入的空行
tbl_df()#用于打印
成员
#>#A tibble:2243 x 2
#>会员简介
#>  *                                               
#>1 Abdnor,James(共和党-南达科他州)A000009
#>Neil Abercrombie 2号(民主党-夏威夷州)A000014
#>3 Abourezk,James(民主党-南达科他州)A000017
#>4亚伯拉罕,拉尔夫·李(共和党-路易斯安那州)A000374
#>5亚伯拉罕,斯宾塞(共和党-密歇根州)A000355
#>6 Abzug,Bella S.(民主党-纽约州)A000018
#>7 Acevedo Vila,Anibal(民主-波多黎各)A000359
#>8阿克曼,加里L.(民主党-纽约州)A000022
#>9亚当斯,阿拉木图州(民主党-北卡罗来纳州)A000370
#>10亚当斯,布鲁克(民主党-华盛顿)A000031
#> # ... 还有2233行
如果愿意,可以进一步提取
成员


还有许多其他有用的数据来源,其中一些与其他有用变量相关。结构良好,并定期更新。

这有点不妥,但是如果您想使用正则表达式提取变量,这里有一些指针

candidate_list <- unlist(candidate_list)

ID <- regmatches(candidate_list, 
  gregexpr("[a-zA-Z]{1}[0-9]{6}", candidate_list))

party_state <- regmatches(candidate_list, 
  gregexpr("(?<=\\()[^)]+(?=\\))", candidate_list, perl=TRUE))

names_etc <- strsplit(candidate_list, "[a-zA-Z]{1}[0-9]{6}")

names <- sapply(names_etc, function(x) sub(" \\([^)]*\\)", "", x))

candidate\u list我尝试了这个,但它删除了一半的成员。应该有4000+,但当我们使用html_表时,它会将其减半。我不明白为什么会发生这种情况,所以我正在尝试其他方法;这个数字被空行夸大了。但是如果你真的想要历史传记指南,你真正需要的就是
成员感谢你的新来源。我不知道那件事。如果我使用您在评论中发布的read.csv代码,当新候选人任职时,它会继续更新吗?还有,你怎么知道有这么多空白?我不认为这有道理。谢谢你的帮助!