如何用R抓取无ID的阿拉斯加选举数据表格并合并整理?
阿拉斯加2018大选州参众院结果抓取方案
针对你要抓取的页面,由于所有表格无ID,我们可以通过职位标题和候选人表格的结构关联性来匹配数据,最终生成每行对应一个职位候选人的记录。以下是具体步骤和代码:
1. 加载所需R包
先确保安装并加载网页抓取和数据处理的核心包:
# 未安装则先运行:install.packages(c("rvest", "dplyr", "purrr", "stringr")) library(rvest) library(dplyr) library(purrr) library(stringr)
2. 获取页面内容
读取目标网页的HTML内容:
url <- "https://www.elections.alaska.gov/results/18GENR/data/results18.htm" page <- read_html(url)
3. 定位职位标题与对应候选人表格
观察页面结构可知:每个州参/众议院职位的标题在.tr类的行中,且该行紧接的下一个<table>就是该职位的候选人投票数据。我们先筛选出州参众院的职位,并绑定对应的HTML元素:
# 筛选州参议院、州众议院的职位标题及对应元素 office_info <- page %>% html_elements(".tr") %>% {tibble( office_name = html_text2(.) %>% str_trim(), element = . )} %>% filter(str_detect(office_name, "State Senate|State House"))
4. 遍历提取每个职位的候选人与票数
遍历每个职位元素,提取对应的候选人表格数据,同时分离总票数:
# 提取每个职位的候选人信息和总票数 election_results <- office_info %>% mutate( table_data = map(element, function(el) { # 获取当前职位对应的候选人表格 candidate_table <- el %>% html_next_sibling() %>% html_table(header = FALSE, trim = TRUE) # 设置表头 colnames(candidate_table) <- c("candidate", "votes") # 提取总票数(表格最后一行) total_votes <- candidate_table %>% filter(str_detect(candidate, "^Total")) %>% pull(votes) %>% as.numeric() # 提取有效候选人数据(排除总票行) candidates <- candidate_table %>% filter(!str_detect(candidate, "^Total")) %>% mutate(votes = as.numeric(votes)) # 返回候选人和总票数 list(candidates = candidates, total_votes = total_votes) }) ) %>% # 展开数据,让每个候选人占一行 unnest(table_data) %>% unnest(candidates)
5. 整理最终数据集
最后整理成清晰的结构化数据,每行对应一个职位的候选人记录:
final_data <- election_results %>% select(office_name, candidate, votes, total_votes) %>% arrange(office_name) # 查看结果示例 head(final_data)
关键说明
- 用
html_next_sibling()精准匹配职位标题对应的候选人表格,避免混淆不同职位的数据 - 通过
str_detect()过滤州参众院职位,排除其他无关竞选数据 - 拆分总票数和候选人数据,确保每条记录包含完整的职位、候选人、得票和该职位总票数信息
内容的提问来源于stack exchange,提问作者inkyliz
相关产品推荐
相关产品推荐

