Загружать файлы из фрейма данных с несколькими элементами и строками, содержащими URL - PullRequest
3 голосов
/ 30 марта 2019

Я собрал несколько URL-адресов с нескольких веб-сайтов и поместил их в большой список, содержащий 145 элементов (для каждого веб-сайта, который был удален).Каждый элемент имеет от 90 до 300 строк в столбце с именем X [[i]].Далее я хочу выполнить поиск слова «повестка дня» в URL-адресах в списке и загрузить документы, используя эти URL-адреса, но у меня возникают проблемы при этом.

Код, который у меня есть на данный момент:

## scrape urls  
  url_base <- "https://amsterdam.raadsinformatie.nl/sitemap/meetings/201%d"
    map_df(7:8, function(i){
    page <- read_html(sprintf(url_base, i))
    data_frame(urls = html_nodes(page, "a") %>% html_attr("href") )
    }) -> urls
    rcverg17_18 <- data.frame(urls[grep("raadscomm", urls$urls), ])

## clean data
  rcverg17_18v2 <- sub(" .*", "", rcverg17_18$urls)

## scrape urls from websites
  list <- map(rcverg17_18v2, function(url) {
    url <-  glue("https://amsterdam.raadsinformatie.nl{url}")
    read_html(url) %>%
    html_nodes("a") %>%
    html_attr("href")
    })
list2 <- lapply(list, as.data.frame)

Это дает большой список, который выглядит следующим образом:

list2

list2 list[145]                     List of length 145
[[1]] list[239 x 1] (S3: dataframe) A data.frame with 239 rows and 1 column
[[2]] list[139 x 1] (S3: dataframe) A data.frame with 139 rows and 1 column
[[3]] list[185 x 1] (S3: dataframe) A data.frame with 186 rows and 1 column
[[4]] list[170 x 1] (S3: dataframe) A data.frame with 170 rows and 1 column
[[.]] ...
[[.]] ...
[[.]] ...

Элемент содержит различную информацию, например:

list2[[1]] 

X[[i]]
1 #zoeken                                                                                            
2 #agenda_container                                                                                                                                                                 
3 #media_wrapper
4 ...

, но также URL-адреса с пробелами в нем,например:

104            https://amsterdam.raadsinformatie.nl/document/4851596/1/ID_17-01-11_Termijnagenda_Verkeer_en_Vervoer

Я хочу найти URL-адреса, содержащие «повестку дня» в своем URL-имени, и загрузить файлы, используя эти URL-адреса.Я знаю, что для загрузки файлов мне нужно использовать функцию download.file (), но я точно не знаю, как это сделать.Также я не знаю, как искать URL-адреса в этом типе данных (с элементами).Может кто-нибудь помочь мне закончить код?

Обратите внимание, что пробелы в ячейках все еще должны быть удалены, чтобы загрузить файлы.

1 Ответ

1 голос
/ 30 марта 2019

Мы можем достичь этого с помощью следующего кода

# Run this code after you create list but before you create list2

data.frame2 = function(x){
  data.frame(x, stringsAsFactors = F)
}

# New code for list 2  
list2 <- lapply(list, data.frame2)

# Convert list to data frame
df = do.call(rbind.data.frame, list2)

# obtain a vector of URL's which contain the work agenda
url.vec = df[df$x %like% "agenda", ]

# Remove elements of the vector which are the string "#agenda_container" (These are not URL's)
url.vec = url.vec[url.vec != "#agenda_container"]

# Obtain all URL's which contain the string "document". These URL's allow us to fetch documents. The URL's which don't contain "document" are webpages and and can not be fetched,
url.vec = url.vec[url.vec %like% "document"]

# Set the working directory
# setwd("~/PATH WHERE YOU WOULD LIKE TO SAVE THE FILES")

# Download files in a loop
# we have to add the extension ".pdf"
# temp.name will name your files with the last part of the URL, after the last backslash ("/")

for(i in url.vec){
  temp.name = tail(unlist(strsplit(i, "\\/")), 1)
  download.file(i, destfile = paste(temp.name,".pdf") )
}

Проверьте вашу папку, все ваши файлы должны быть загружены.Вот временная папка, в которую я скачал ваши файлы:

Folder after downloading all documents

...