2017-02-22 1 views
3

U.N. 안전 보장 이사회 (UNSC) 결의안의 텍스트를 R으로 긁으 려합니다. 유엔은 PDF 형식 (here)의 모든 UNSC 결의안의 온라인 아카이브를 관리합니다. 따라서 이론 상으로는 이것이 가능해야합니다.iframe에서 PDF로 스크랩 R

특정 연도의 하이퍼 링크를 클릭 한 다음 특정 문서 (예 : this one)에 대한 링크를 클릭하면 브라우저에서 PDF를 볼 수 있습니다. URL 표시 줄의 링크에서 download.file을 가리켜 서 PDF를 다운로드하려고하면 제대로 작동하는 것 같습니다. 그러나 pdftools 패키지의 pdf_text 함수를 사용하여 해당 파일의 내용을 R로 읽으려고하면 오류 메시지 스택이 나타납니다.

내가 뭘 하려는지 그게 실패하고있어. 실행하면 오류 메시지가 표시됩니다.

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에서 'Inspect'옵션을 사용하여 'src'로 식별 된 URL을 확인하십시오 (this link). 내 과정의 나머지 부분을 가리켜. 다시 download.file 부분이 실행되지만 pdf_text을 실행하면 같은 오류 메시지가 나타납니다. 나는 또한 을 download.file으로 호출하고, ".pdf"를 tmp의 경로 끝에 붙여 넣으려고 시도했지만 어느 쪽도 도움이되지 않았다.

+0

어떤 오류 메시지는 점점 :

다음은 게시 된 링크에 대한 예입니다? 'download.file()'로 파일을 다운로드 한 후 열 수 있습니까? – MrFlick

+0

@MrFlick, 오류 메시지 스택은 '오류 : PDF 파일이 아닐 수 있습니다. (계속 진행 중입니다.'), '잘못된 문자'메시지가 포함되어 있으며 '오류 : PDF 구문 분석 실패'로 끝납니다. – ulfelder

+0

시도해 보았습니다. 귀하의 코드와 다운로드 된 PDF 파일이 손상되었습니다. 브라우저에서 해당 링크를 사용하면 오류가 발생합니다. 링크가 맞습니까? – anonR

답변

5

다운로드하려는 pdf는 기본 페이지의 iframe에 있으므로 다운로드하는 링크에는 html 만 포함됩니다. iframe의 링크를 따라 가면 pdf에 대한 실제 링크를 얻을 수 있습니다. pdf를 다운로드하려면 직접 링크로 이동하기 전에 쿠키/임시 URL을 얻으려면 여러 페이지로 이동해야합니다.

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