You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:37:32