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

使用循环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)
}

错误原因解析:

  1. 管道符写错:%>应为%>%,这是语法层面的硬错误
  2. 手动拆分单元格的逻辑缺陷:将所有td/th拉成向量后转矩阵,若单元格总数不是3的倍数,会生成维度混乱的矩阵,触发row_to_names的参数错误(即你遇到的Error: x must be a string of length 1)
  3. 无关链接干扰:部分无效链接指向无表格页面,导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:47:12