使用Purrr Map从多个URL抓取Twitter链接时出现UseMethod("xml_find_first")错误
解决方案:从Abgeordnetenwatch抓取议员Twitter链接并合并到数据集
问题核心分析
你之前的代码报错,核心原因是在map_df里错误引用了整个pages列表,而非当前迭代的单个HTML页面元素。另外还需要精准定位Twitter链接,并处理缺失链接返回NA的场景。
完整实现步骤
1. 加载依赖包
library(tidyverse) library(rvest)
2. 定义目标链接向量
links <- c( "https://www.abgeordnetenwatch.de/profile/julia-obermeier", "https://www.abgeordnetenwatch.de/profile/anja-weisgerber", "https://www.abgeordnetenwatch.de/profile/klaus-ernst", "https://www.abgeordnetenwatch.de/profile/astrid-freudenstein" )
3. 编写单页面抓取函数
先封装一个处理单个页面的函数,负责提取议员姓名和Twitter链接,自动处理缺失情况:
scrape_twitter_info <- function(page_html) { # 提取议员姓名 member_name <- page_html %>% html_element("h1") %>% html_text(trim = TRUE) # 精准定位Twitter链接:筛选包含twitter域名的a标签,无链接则返回NA twitter_url <- page_html %>% html_element("a[href*='twitter.com']") %>% html_attr("href") %>% replace_na(NA_character_) # 返回单行数据框 tibble(name = member_name, twitter_link = twitter_url) }
4. 批量处理并生成结果
# 读取所有目标页面(和你之前的操作一致) pages <- links %>% map(read_html) # 批量抓取并合并为完整数据框 twitter_results <- pages %>% map_df(scrape_twitter_info)
5. 合并到原始数据集
假设你的原始数据集名为original_data,且包含用于匹配的name列,直接用左连接合并即可:
final_dataset <- original_data %>% left_join(twitter_results, by = "name")
关键修正与优化说明
- 修复迭代元素引用错误:你之前在
map_df里用了html_node(pages, "h1"),这里的pages是整个列表,而不是当前迭代的单个页面。单独封装函数的方式更清晰,也避免了这类错误。 - 精准筛选Twitter链接:使用CSS选择器
a[href*='twitter.com'],直接定位包含Twitter域名的链接,避免抓取其他无关链接。 - 缺失值自动处理:通过
replace_na()将无链接的场景转为NA,完全符合你的需求。 - 可选:加入错误容错
如果担心部分页面加载失败导致整个流程中断,可以用possibly()包装抓取函数,实现错误跳过:
# 包装成容错版函数 safe_scrape <- possibly(scrape_twitter_info, otherwise = tibble(name = NA_character_, twitter_link = NA_character_)) # 安全批量处理 twitter_results <- pages %>% map_df(safe_scrape)
内容的提问来源于stack exchange,提问作者KPM
相关产品推荐
相关产品推荐

