Перебирайте массив файлов PDF онлайн и копируйте текст с каждого - PullRequest
0 голосов
/ 03 мая 2018

Я вижу, что это очень легко - захватить PDF-файл, сохранить его и извлечь весь текст из файла.

library(pdftools)
download.file("http://www2.sas.com/proceedings/sugi30/085-30.pdf", "sample.pdf", mode = "wb")
txt <- pdf_text("sample.pdf")

Мне интересно, как пройтись по массиву файлов PDF, основанных на ссылках, загрузить каждый из них и очистить тест от каждого. Я хочу перейти по следующей ссылке.

http://www2.sas.com/proceedings/sugi30/toc.html#dp

Затем я хочу загрузить каждый файл с «Бумага 085-30:» на «Бумага 095-30:». Наконец, я хочу вычеркнуть текст из каждого файла. Как я могу это сделать?

Я бы подумал, что это будет примерно так, но я подозреваю, что функция вставки настроена неправильно.

library(pdftools)
for(i in values){'085-30',' 086-30','087-30','088-30','089-30'
paste(download.file("http://www2.sas.com/proceedings/sugi30/"i".pdf", i".pdf", mode = "wb")sep = "", collapse = NULL)
}

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете получить список PDF-файлов, используя rvest.

library(rvest)

x <- read_html("http://www2.sas.com/proceedings/sugi30/toc.html#dp")
href <- x %>% html_nodes("a") %>% html_attr("href")

 # char vector of links, use regular expression to fetch only papers
links <- href[grepl("^http://www2.sas.com/proceedings/sugi30/\\d{3}.*\\.pdf$", href)]

Я добавил обработку ошибок и не забудьте перевести сеанс R в режим сна, чтобы не затопить сервер. Если загрузка не удалась, ссылка сохраняется в переменной, которую вы можете исследовать после завершения цикла и, возможно, адаптировать свой код или просто загрузить их вручную.

# write failed links to this variable
unsuccessful <- c()

for (link in links) {
  out <- tryCatch(download.file(url = link, destfile = basename(link), mode = "wb"), 
                  error = function(e) e, warning = function(w) w)

  if (class(out) %in% c("simpleError", "simpleWarning")) {
    message(sprintf("Unable to download %s ?", link))
    unsuccessful <- c(unsuccessful, link)
  }

  sleep <- abs(rnorm(1, mean = 10, sd = 10))
  message(sprintf("Sleeping for %f seconds", sleep))
  Sys.sleep(sleep) # don't flood the server, sleep for a while 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...