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

R语言rvest爬虫报arguments imply differing number of rows错求助

问题根源
  • 当前爬取逻辑是独立提取所有城市、商家名、地址字段,完全没有匹配页面的层级结构:
    • 原页面结构为「城市(h2标签)→ 多个商家(h3标签)→ 每个商家对应1~N个地址(p标签)」,单独批量拉取所有标签必然出现长度不匹配
    • 之前提取的City字段选的是h1下的a标签,只能拿到整个页面的标题,根本不是每个商家所属的城市,长度只有1当然无法和数百个商家匹配
    • 地址选择器h3+ p只会提取每个商家的第一个地址,多地址商家的后续地址会被漏抓,导致地址数量远少于商家数量
解决思路

先按商家层级遍历节点,每个商家单独匹配对应的所属城市、商家名、所有地址,保证字段一一对应。多地址可以选择拼接为单个字符串(每个商家1行)或者拆分为多行(每个地址1行)。

修正后可运行代码
library(rvest)
library(dplyr)
library(purrr)

# 读取页面
link = "https://www.slga.com/permits-and-licences/cannabis-permits/cannabis-retailing/cannabis-retailers-in-saskatchewan"
page = read_html(link)

# 提取所有商家节点
shop_nodes <- page %>% html_nodes("main h3")

# 遍历每个商家节点,匹配对应的城市、名称、地址
SaskatchewanPR <- map_dfr(shop_nodes, function(node){
  # 提取商家名
  shop_name <- node %>% html_text2()
  # 向上找最近的h2标签,就是当前商家所属的城市
  city <- node %>% html_elements(xpath = "./preceding-sibling::h2[1]") %>% html_text2()
  # 提取当前商家对应的所有地址:找h3后面的p标签,直到下一个h3/h2
  addresses <- node %>% html_elements(xpath = "./following-sibling::p[preceding-sibling::h3[1] = current() and not(self::h3 or self::h2)]") %>% html_text2()
  # 多地址用分号拼接,也可以直接返回addresses拆成多行
  address <- paste(addresses, collapse = "; ")
  
  # 返回单条数据
  tibble(
    Province = "Saskatchewan",
    City = city,
    Name = shop_name,
    Address = address,
    Date = Sys.Date()
  )
})
可选:多地址拆分为多行的修改方式

如果需要每个地址单独占一行,只需要去掉地址拼接逻辑,直接返回地址列表即可,map_dfr会自动补全其他公共字段:

# 遍历逻辑中的返回部分修改为如下即可
tibble(
  Province = "Saskatchewan",
  City = city,
  Name = shop_name,
  Address = addresses,
  Date = Sys.Date()
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:15:04