使用Rvest抓取选举页面时遭遇xml_missing的问题求助
解决Rvest抓取路易斯安那州选举日期的问题
问题根源
你遇到的{xml_missing} <NA>错误,核心原因有两个:
- 目标页面是服务器自动生成的静态目录索引页,链接嵌套在
<table>结构中,直接调用html_element("a")无法定位到目标节点; - 部分服务器会拦截无浏览器标识的请求,导致
read_html获取到的内容不完整。
解决方案
1. 模拟浏览器请求获取完整页面
给请求添加User-Agent头,避免被服务器拦截:
library(rvest) library(httr) la_elections_url <- "https://voterportal.sos.la.gov/static/" # 模拟Chrome浏览器请求头 request_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ) # 带请求头获取页面内容 la_elections_page <- read_html(GET(la_elections_url, request_headers))
2. 精准定位日期链接
静态目录页的日期链接都嵌套在表格的单元格中,用更精准的CSS选择器提取:
# 提取所有目录链接 all_links <- la_elections_page %>% html_elements("table tr td a") %>% html_attr("href") # 过滤出YYYY-MM-DD格式的选举日期(排除上级目录"../") election_dates <- all_links[grepl("^\\d{4}-\\d{2}-\\d{2}$", all_links)] # 生成完整子页面URL election_urls <- paste0(la_elections_url, election_dates)
3. 遍历页面下载并合并Excel表格
拿到有效URL后,遍历每个页面定位“Excel - Complete Results”链接,下载并合并数据:
library(dplyr) library(readxl) library(purrr) # 遍历处理每个选举页面 compiled_results <- map_dfr(election_urls, function(url) { # 获取子页面内容 sub_page <- read_html(GET(url, request_headers)) # 定位Excel下载链接 excel_href <- sub_page %>% html_elements("a:contains('Excel - Complete Results')") %>% html_attr("href") %>% first() if (!is.na(excel_href)) { # 拼接完整下载链接并下载 full_excel_url <- paste0(url, "/", excel_href) temp_file <- tempfile(fileext = ".xlsx") download.file(full_excel_url, temp_file, mode = "wb") # 读取Excel并添加选举日期标识 read_excel(temp_file) %>% mutate(election_date = basename(url)) } })
排查技巧
- 如果仍无法获取链接:右键查看页面源码,确认
<a>标签的父结构,调整CSS选择器(比如用"a[href^='20']"直接筛选20开头的日期链接); - 若页面需要Cookie:改用
rvest::session()维持会话,先访问主页再请求目录页。
内容的提问来源于stack exchange,提问作者Rvest question
相关产品推荐
相关产品推荐

