处理 RVEST 的递归函数故障排除

问题描述 投票:0回答:1

我正在尝试使用此网站进行网络抓取以获取国际地点列表:https://restaurants.subway.com

我目前的代码遇到这个问题,其中 href 被我的粘贴函数通过“links”变量重复添加到我的 url。有没有一种方法可以将 href 添加到我的 url 中,然后到达每个单独位置的地址页面?

这是我当前的代码:

library(dplyr)
library(rvest)

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

addressParser <- function(url) {                                   
  links <- read_html(url) %>%                                                   
    html_elements(".Directory-listLink") %>%   
    html_attr("href")
    link <- paste(url, links, sep = "/")     
  if (url == "https://restaurants.subway.com/index.html") {
    dead_link <- paste(url, sep = "")
    NA <- dead_link

  } else if (length(link) == 0) { 

    link %>%
      html_element("#address") %>%
      html_text2()

   } else {
     c(lapply(link, addressParser), recursive = TRUE)     
  }
 }

 addressParser(subway)

此代码导致“https://restaurants.subway.com/austria/austria/bu”,但我想要的是“https://restaurants.subway.com/austria/bu”

html r web-scraping recursion
1个回答
0
投票

看第二级递归中

links
的值,以奥地利为例:

links <- read_html("https://restaurants.subway.com/austria") %>%                                                   
  html_elements(".Directory-listLink") %>%   
  html_attr("href")
links

#> [1] "austria/bu"                  
#> [2] "austria/ka"                  
#> [3] "austria/ni"                  
#> [4] "austria/ob"                  
#> [5] "austria/sa"                  
#> [6] "austria/st"                  
#> [7] "austria/ti"                  
#> [8] "austria/vi/wien"             
#> [9] "austria/additional-locations"

这些值已经包含

"austria"
,因此当您将它们粘贴到
"https://restaurants.subway.com/austria"
之后时,您会得到双倍
"austria"

您可以通过多种方式解决此问题,但这里的一种方法是将

url
参数拆分为
root
path
参数:

addressParser <- function(root, path) { 
  url <- paste(root, path, sep = "/")
  print(url)
  links <- read_html(url) %>%                                                   
    html_elements(".Directory-listLink") %>%   
    html_attr("href")
  link <- paste(root, links, sep = "/")     
  if (url == "https://restaurants.subway.com/index.html") {
    dead_link <- paste(url, sep = "")
    NA <- dead_link
    
  } else if (length(link) == 0) { 
    
    link %>%
      html_element("#address") %>%
      html_text2()
    
  } else {
    c(lapply(links, function(p) addressParser(root, p)), recursive = TRUE)     
  }
}

addressParser(subway, "")
© www.soinside.com 2019 - 2024. All rights reserved.