我正在尝试使用此网站进行网络抓取以获取国际地点列表: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”
看第二级递归中
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, "")