2017-02-22 5 views
3

U.N.国連安全保障理事会(UNSC)の決議案をRに盗み出そうとしています.U.N.はUNSC決議すべてのオンラインアーカイブをPDF形式(here)で管理しています。だから、理論的には、これは可能なはずです。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) 

私は何が欠けていますか?私はだと思います。これらのファイルのダウンロード可能なバージョンへのリンクアドレスは、ブラウザ内の表示用のリンクアドレスとは異なりますが、前者のパスを取得する方法はわかりません。ダウンロードアイコンを右クリックしてみました。 Chromeの「Inspect」オプションを使用して、そこに「src」として識別されたURLを表示します(this link)。私のプロセスの残りをそれに指しています。繰り返しますが、download.file部分が実行されますが、pdf_textを実行すると同じエラーメッセージが表示されます。私はまた、の部分をdownload.fileに変更し、b) ".pdf"をtmpのパスの最後に付け加えましたが、どちらも助けられませんでした。

+0

あなたはどのようなエラーメッセージを取得していますか?ファイルを 'download.file()'でダウンロードした後で開くことができますか? – MrFlick

+0

@MrFlick、エラーメッセージのスタックは 'エラー:PDFファイルではない(続行中)'で始まり、 '不正な文字 'メッセージを含み、' Error:PDF parsing failure'で終わります。 – 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

関連する問題