2017-02-22 4 views
3

Я пытаюсь очистить текст резолюций Совета Безопасности ООН (UNSC) в R. U.N поддерживает онлайн-архив всех резолюций СБ ООН в формате PDF (here). Поэтому теоретически это должно быть сделано.Скребок PDF из iframe в R

Если я нажимаю на гиперссылку в течение определенного года, а затем на ссылку для конкретного документа (например, this one), я могу видеть PDF в своем браузере. Когда я пытаюсь загрузить этот PDF-файл, указав download.file по ссылке в строке URL-адреса, он работает. Однако, когда я пытаюсь прочитать содержимое этого файла в R с помощью функции pdf_text из пакета pdftools, я получаю стек сообщений об ошибках.

Вот что я пытаюсь, это неудачно. Если вы запустите его, вы увидите сообщения об ошибках, о которых я говорю.

library(pdftools) 
pdflink <- "http://www.un.org/en/ga/search/view_doc.asp?symbol=S/RES/2341(2017)" 
tmp <- tempfile() 
download.file(pdflink, tmp, mode = "wb") 
doc <- pdf_text(tmp) 

Что мне не хватает? I думаю, что имеет отношение к адресам ссылок к загружаемым версиям этих файлов, отличным от адресов ссылок для отображения в браузере, но я не могу понять, как получить путь к первому. Я попытался щелкнуть правой кнопкой мыши значок загрузки; используя опцию «Проверка» в Chrome, чтобы увидеть URL-адрес, указанный как «src» (this link); и указывая на остальную часть моего процесса на нем. Опять же, часть download.file выполняет, но я получаю те же сообщения об ошибках, когда я запускаю pdf_text. Я также попробовал a) изменить mode часть вызова на download.file и b) наклеить «.pdf» на конец пути до tmp, но ни один из них не помог.

+0

сообщения Какие ошибки вы получаете? Вы можете открыть файл после загрузки с помощью 'download.file()'? – MrFlick

+0

@MrFlick, стек сообщений об ошибках начинается с 'error: Может быть, файл PDF (продолжающийся в любом случае)', включает в себя кучу сообщений «незаконного символа» и заканчивается «Ошибка: ошибка синтаксического анализа PDF». – ulfelder

+0

Я попробовал ваш код и загруженный файл PDF были повреждены. Когда я пытаюсь использовать указанную ссылку в браузере, она также дает некоторую ошибку. Правильно ли ссылка? – anonR

ответ

5

pdf, который вы хотите загрузить, находится в iframe на главной странице, поэтому ссылка, которую вы скачиваете, содержит только html. Вам нужно перейти по ссылке в iframe, чтобы получить фактическую ссылку на pdf. Вам нужно перейти на несколько страниц, чтобы получить файлы cookie/временные URL-адреса, прежде чем перейти к прямой ссылке для загрузки pdf.

Вот пример для ссылки, которую разместил:

rm(list=ls()) 
library(rvest) 
library(pdftools) 

s <- html_session("http://www.un.org/en/ga/search/view_doc.asp?symbol=S/RES/2341(2017)") 
#get the link in the mainFrame iframe holding the pdf 
frame_link <- s %>% read_html() %>% html_nodes(xpath="//frame[@name='mainFrame']") %>% 
    html_attr("src") 

#go to that link 
s <- s %>% jump_to(url=frame_link) 

#there is a meta refresh with a link to another page, get it and go there 
temp_url <- s %>% read_html() %>% 
    html_nodes("meta") %>% 
    html_attr("content") %>% {gsub(".*URL=","",.)} 

s <- s %>% jump_to(url=temp_url) 

#get the LtpaToken cookie then come back 
s %>% jump_to(url="https://documents-dds-ny.un.org/prod/ods_mother.nsf?Login&Username=freeods2&Password=1234") %>% 
    back() 

#get the pdf link and download it 
pdf_link <- s %>% read_html() %>% 
    html_nodes(xpath="//meta[@http-equiv='refresh']") %>% 
    html_attr("content") %>% {gsub(".*URL=","",.)} 

s <- s %>% jump_to(pdf_link) 
tmp <- tempfile() 
writeBin(s$response$content,tmp) 
doc <- pdf_text(tmp) 
doc 
+0

Спасибо. Теперь, чтобы перебрать его на множество резолюций последних полувеков ... – ulfelder

Смежные вопросы