使用循环Web Scraping获取墨西哥城邮政编码报错求助
问题排查与解决思路
一、先过滤有效市政区链接
原代码抓取了页面所有<a>标签的链接,包含导航、其他地区等无关内容,先筛选出墨西哥城市政区的目标链接:
library(httr) library(XML) url <- "https://www.codigopostal.lat/mexico/Ciudad-de-Mexico/" resource <- GET(url) parse <- htmlParse(resource) # 只提取包含市政区路径的链接,去重并排除首页链接 links <- unique(as.character(xpathSApply(parse, path="//a[contains(@href, 'Ciudad-de-Mexico/')]", xmlGetAttr, "href"))) links <- links[links != url]
二、修复Scraper函数的核心问题
你的函数存在语法错误和逻辑漏洞,以下是修正后的版本:
library(rvest) library(dplyr) library(tibble) scraper <- function(url){ # 加入延迟避免反爬 Sys.sleep(1) html <- read_html(url) # 直接抓取表格并自动解析为数据框,比手动提取td/th更可靠 tabla <- html %>% html_element("table") %>% html_table(header = TRUE) # 统一列名(根据页面实际表头调整,确保和预期一致) colnames(tabla) <- c("municipality", "locality", "zp") return(tabla) }
错误原因解析:
- 管道符写错:
%>应为%>%,这是语法层面的硬错误 - 手动拆分单元格的逻辑缺陷:将所有td/th拉成向量后转矩阵,若单元格总数不是3的倍数,会生成维度混乱的矩阵,触发
row_to_names的参数错误(即你遇到的Error: x must be a string of length 1) - 无关链接干扰:部分无效链接指向无表格页面,导致
tabla为空向量,进一步加剧矩阵转换错误
三、批量抓取并合并数据
用purrr的map_dfr自动合并所有页面数据,同时加入错误处理避免流程中断:
library(purrr) # 包装函数,遇到错误页面返回空数据框 safe_scraper <- possibly(scraper, otherwise = tibble(municipality = character(), locality = character(), zp = character())) # 批量抓取并合并 all_data <- map_dfr(links, safe_scraper)
内容的提问来源于stack exchange,提问作者AlmaJ
相关产品推荐
相关产品推荐

