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
相关产品推荐
相关产品推荐

