使用R语言爬取维基百科安大略省非建制社区列表的方法求助
解决方案
目标页面的非建制社区信息按字母分组存放在对应标题后的无序列表中,我们需要精准定位这些列表项,拆分出社区名与所属县,再转换为你需要的交替行格式表格。
完整代码
library(rvest) library(stringr) library(tidyr) # 读取目标页面 url <- "https://en.wikipedia.org/wiki/List_of_unincorporated_communities_in_Ontario" page <- read_html(url) # 定位有效列表项:仅抓取字母标题下方的社区列表 community_items <- page %>% html_nodes("div.mw-content-ltr h3 + ul li") %>% html_text2() # 自动清理文本中的多余空格、换行 # 拆分社区名与所属县:匹配「社区名 (县名)」的格式 community_data <- str_match(community_items, "^(.*?)\\s*\\((.*?)\\)$") %>% as.data.frame(stringsAsFactors = FALSE) %>% select(社区名 = V2, 县名 = V3) # 转换为交替行格式并添加id列 final_table <- community_data %>% pivot_longer(cols = everything(), values_to = "names") %>% select(-name) %>% mutate(id = row_number()) %>% relocate(id, names) # 查看结果示例 head(final_table, 8)
关键步骤说明
- 精准定位节点:用
h3 + ul li选择器过滤掉页面导航栏等无关列表,只抓取字母标题紧跟的社区列表项。 - 文本清理与拆分:
html_text2()解决原始文本格式混乱问题;正则表达式^(.*?)\\s*\\((.*?)\\)$精准拆分出社区名和所属县。 - 格式转换:通过
pivot_longer()把每个社区-县对拆分为两行(社区名一行、县名一行),再添加自增id列,完全匹配你需要的表格结构。
如果遇到少数格式异常的条目(无括号标注县名),可以用str_detect()单独过滤或补充处理,目标页面绝大多数条目都符合标准格式。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

