
本文介绍如何利用 rvest 包从欧洲议会官网批量抓取议员姓名、所属党团及国籍/政党信息,并通过矩阵转换实现三列结构化存储,适用于多语言网页的稳健解析。
在数据采集实践中,欧洲议会官网(https://www.php.cn/link/e73b38ff519142fdc3723ddf4a3a5825)是获取权威议员信息的重要来源。其成员列表页(如意大利语版 https://www.php.cn/link/e73b38ff519142fdc3723ddf4a3a5825/meps/it/full-list/all)采用语义清晰的 HTML 结构:议员姓名通常位于
要将该“三行一组”的扁平化文本流转化为结构化数据表,关键在于正确重塑(reshape)向量。html_text() 返回的是字符向量,长度为 3 × N(N 为议员总数)。此时直接调用 matrix(..., ncol = 3, byrow = TRUE) 即可按行优先方式将其重排为 N × 3 矩阵,完美匹配字段逻辑。
以下是完整、可复现的 R 教程代码:
library(rvest) library(dplyr) # Step 1: 抓取页面 url <- "https://www.php.cn/link/e73b38ff519142fdc3723ddf4a3a5825/meps/it/full-list/all" page <- read_html(url) # Step 2: 提取议员姓名(每个对应一人) names_vec <- page %>% html_elements("div.erpl_title-h4.t-item") %>% html_text(trim = TRUE) # Step 3: 提取附加信息(党团/国籍/国内政党),并重塑为三列矩阵 info_vec <- page %>% html_elements(".sln-additional-info") %>% html_text(trim = TRUE) # ⚠️ 注意:确保 info_vec 长度是 names_vec 的 3 倍,否则 reshape 会出错 if (length(info_vec) != 3 * length(names_vec)) { warning("附加信息条目数与议员数不匹配(应为3倍),请检查CSS选择器或页面结构变更") } info_mat <- matrix(info_vec, ncol = 3, byrow = TRUE) colnames(info_mat) <- c("Political_Group", "Country", "National_Party") # Step 4: 合并为数据框(推荐替代 cbind,避免类型强制转换问题) df <- data.frame( Name = names_vec, Political_Group = info_mat[, 1], Country = info_mat[, 2], National_Party = info_mat[, 3], stringsAsFactors = FALSE ) # 查看前6行结果 head(df)
重要注意事项:
- ✅ 编码与语言版本:示例使用意大利语路径(/meps/it/...),若需其他语言(如英语 /meps/en/...),请同步更新 URL 并验证 CSS 类名是否一致(部分语言版本可能微调 class 名,建议始终用 Chrome DevTools 实时校验);
- ✅ 反爬与稳定性:该站点无强反爬机制,但建议添加 Sys.sleep(1) 或使用 httr::GET(..., timeout(10)) 增强鲁棒性;
- ✅ 数据清洗:html_text() 可能引入多余空格或换行符,务必启用 trim = TRUE;
- ❌ 避免 cbind() 直接拼接:cbind() 会将所有列转为 character,且返回矩阵而非数据框;使用 data.frame() 显式构造更可控、可扩展;
- ? 动态分页处理:当前链接为“全量列表”,若目标页面分页(如 /meps/it/full-list/1),需循环抓取并 rbind() 合并。
本方案以最小依赖、最大可读性完成从原始 HTML 到规整表格的转化,是政务公开数据采集的典型范式。掌握此模式后,可快速适配类似“三字段并列展示”的政府名录类网站。








