html()无法正确读取列表中的网址

时间:2019-04-27 02:23:02

标签: r rvest

我想从某个网站上抓取pdf文件。我可以手动下载它们,但这是一个学习练习,以便以后可以做更多的站点。

我正在尝试使用rvest,但我的基本功能不可用。

library(tidyverse)
library(rvest)

trial <- 'http://www.fairlabor.org/report/2015-annual-public-report'
page2<- html(trial)
page2 %>% html_nodes("a") %>% html_attr("href") %>% str_subset(".pdf") %>% download.file("~/downloads/file.pdf")

我想对所有年度报告都这样做。所以我尝试了:

url <- 'http://www.fairlabor.org/impact/reports'
page<- html(url)
links_init <- page %>% html_nodes("a") %>% html_attr("href")
links <- links_init[seq(from = 53, to = 72, by = 2)]
new_urls <- paste0(url, links)

# trying to repeat the above basic example. If it succeeds, I can put in a for loop.
test <- html(new_urls[2])
test %>% html_nodes("a") %>% html_attr("href") %>% str_subset(".pdf")

相反,我得到的结果为空,因为它似乎在抓取其他页面。我不知道为什么会这样,因为page2test似乎是相同的字符串。

任何人都知道这里发生了什么以及如何纠正它?

我尝试使用new_urls明确将网址as.character(quote())的向量转换为字符串。

1 个答案:

答案 0 :(得分:1)

看一下基本URL,似乎有2003到2017年的报告。我们可以首先创建这些年份的urls列表

urls <- paste0("http://www.fairlabor.org/report/",seq(2003, 2017),
               "-annual-public-report")

urls
# [1] "http://www.fairlabor.org/report/2003-annual-public-report"
# [2] "http://www.fairlabor.org/report/2004-annual-public-report"
# [3] "http://www.fairlabor.org/report/2005-annual-public-report"
# [4] "http://www.fairlabor.org/report/2006-annual-public-report"
# [5] "http://www.fairlabor.org/report/2007-annual-public-report"
# [6] "http://www.fairlabor.org/report/2008-annual-public-report"
# [7] "http://www.fairlabor.org/report/2009-annual-public-report"
# [8] "http://www.fairlabor.org/report/2010-annual-public-report"
# [9] "http://www.fairlabor.org/report/2011-annual-public-report"
#[10] "http://www.fairlabor.org/report/2012-annual-public-report"
#[11] "http://www.fairlabor.org/report/2013-annual-public-report"
#[12] "http://www.fairlabor.org/report/2014-annual-public-report"
#[13] "http://www.fairlabor.org/report/2015-annual-public-report"
#[14] "http://www.fairlabor.org/report/2016-annual-public-report"
#[15] "http://www.fairlabor.org/report/2017-annual-public-report"

现在,不存在每个URL的报告,这可能会导致错误,因此我们可以使用tryCatch跳过这些报告的下载。我们可以使用lapply从所有urls

下载报告
library(tidyverse)
library(rvest)

lapply(urls, function(x) tryCatch({ x %>%
  read_html() %>%
  html_nodes("a") %>%
  html_attr("href") %>%
  str_subset(".pdf") %>%
  download.file(paste0("~/downloads/", basename(x), ".pdf"))}, 
  error = function(e) { }))

这将在名为2003-annual-public-report.pdf2006-annual-public-report.pdf等的下载文件夹中下载pdf报告。