我正在尝试废弃该网站并从多个页面中提取内容。我每次都使用 while 循环来增加页码,但它不起作用。它所做的只是从第 0 页复制相同的内容,而不是从其他页面获取内容(在下面的示例中重复 3 次)。
我不确定我错过了什么。
library(tidyverse)
library(rvest)
base_url <- "https://npin.cdc.gov/search?=type%3Aorganization&page="
# counter:
e <- 0
result <- data.frame(org_name = as.integer(),
services = as.character(),
item = as.character(),
street = as.character(),
city = as.character(),
state = as.character())
while (e <= 3) {
cat(".")
new_page <-
read_html(
# change the page number with each iteration of the loop
sprintf(
base_url,
e
)
)
services <- new_page %>% html_nodes(".services-fieldset")
org_name <- new_page %>% html_nodes(".block-field-blocknodeorganizationtitle") %>% html_text2()
street <- new_page |> html_nodes(".address-line1") |> html_text2()
city <- new_page |> html_nodes(".locality") |> html_text2()
state <- new_page |> html_nodes(".administrative-area") |> html_text2()
zip <- new_page |> html_nodes(".postal-code") |> html_text2()
new_result <- for (i in 1:length(services)) {
temp <- services[i] %>% html_nodes(".field__items")
for (j in 2:length(temp)) {
label <- temp[j] %>% html_nodes(".field-label") %>% html_text() %>% gsub(":", "", .)
items <- temp[j] %>% html_nodes(".field__item") %>% html_text()
result[nrow(result) +1, ] <- c(org_name[i], label, paste0(items, collapse = ","))
}
}
# append each iteration of the data to the main table:
result <-
rbind(
result,
new_result
)
# increase counter
e <- e + 1
}
result |> tibble()
这里有很多问题。您已经修复了不存在的
new_york_raw
对象,但在循环内增长 result
,然后将其绑定到 new_result
(这是 for
循环的输出,即 )仍然没有意义。 NULL
。
可能最大的问题是您通过
sprintf(base_url, e)
创建 URL,但它并没有按照您的想法进行操作 - 您可能需要 paste0(base_url, e)
或类似的功能。
组合修复可能如下所示。我用
do.call
和 *apply
替换了循环,这对性能没有太大影响,但却是 R 中将数据绑定在一起的更自然的方式。
library(tidyverse)
library(rvest)
base_url <- "https://npin.cdc.gov/search?=type%3Aorganization&page="
all_e <- 0:3
result <- do.call(rbind.data.frame, lapply(all_e, \(e) {
new_page <- read_html(paste0(base_url, e)) ## Use correct URL
services <- html_nodes(new_page, ".services-fieldset")
orgs <- html_nodes(new_page, ".block-field-blocknodeorganizationtitle") |> html_text2()
streets <- html_nodes(new_page, ".address-line1") |> html_text2()
cities <- html_nodes(new_page, ".locality") |> html_text2()
states <- html_nodes(new_page, ".administrative-area") |> html_text2()
zips <- html_nodes(new_page, ".postal-code") |> html_text2()
do.call(rbind, lapply(seq_along(services), \(i) {
tmp <- html_nodes(services[i], ".field__items")
cbind(
data.frame(
Org=orgs[i],
Street=streets[i],
City=cities[i],
State=states[i],
Zip=zips[i]
),
do.call(rbind, lapply(tmp[-1], \(t) {
label <- html_nodes(t, ".field-label") |> html_text() |> gsub(":", "", x=_)
items <- html_nodes(t, ".field__item") |> html_text()
c("Label"=label, "Items"=paste0(items, collapse = ","))
}))
)
}))
}))
result |> tibble()
作为一个小烦恼,我不知道为什么有人会写
x <- y |> f()
而不仅仅是x <- f(y)
?