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

使用rvest递归爬取Subway门店地址时URL重复拼接问题排查

解决Subway门店地址爬取的URL重复拼接问题

你的核心问题是手动拼接URL时没处理相对路径的层级关系,递归过程中重复叠加路径,导致生成https://restaurants.subway.com/austria/austria/bu这类错误链接。

解决方案:用绝对URL转换函数替代手动拼接

用httr包的url_absolute()函数可以自动把页面里的相对路径转换成正确的绝对URL,彻底避免手动拼接的错误。

修正后的完整代码

library(dplyr)
library(rvest)
library(httr) # 用于url_absolute函数

subway_base <- "https://restaurants.subway.com"

addressParser <- function(url) {                                    
  # 读取页面并获取所有目录链接的相对路径
  links <- read_html(url) %>%                                                    
    html_elements(".Directory-listLink") %>%   
    html_attr("href")
  
  # 将相对路径转换为绝对URL,避免重复拼接
  absolute_links <- url_absolute(links, url)
  
  # 没有目录链接时,说明进入单门店页面,提取地址
  if (length(absolute_links) == 0) { 
    read_html(url) %>%
      html_element("#address") %>%
      html_text2()
  } else {
    # 递归遍历所有子链接,收集地址
    unlist(lapply(absolute_links, addressParser))
  }
}

# 启动爬取
addresses <- addressParser(subway_base)
head(addresses)

关键调整说明

  1. 替换URL拼接逻辑:url_absolute(links, url)会根据当前页面URL自动解析相对路径,生成唯一正确的绝对URL,彻底解决路径重复问题,不用再手动拼接。
  2. 修正门店地址提取:原代码在无目录链接时错误用空的link变量解析页面,现在改为用当前传入的url读取页面并提取地址。
  3. 移除无效判断:原代码中针对index.html的判断完全多余,url_absolute会自动处理初始页面的相对路径。
  4. 简化结果扁平化:用unlist替代c(..., recursive=TRUE),更简洁地把递归返回的列表转成地址向量。

内容的提问来源于stack exchange,提问作者Dawon Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:32:44