2015-08-25 35 views
2

我試圖從R!上獲取HTTP/FTP服務器上的文件列表,以便下一步我將能夠下載它們(或選擇一些符合要求的文件我的標準下載)。在R中的HTTP/FTP服務器上列出文件

我知道可以在網頁瀏覽器(下載管理器)中使用外部程序,這將允許我從當前網頁/ ftp中選擇要下載的文件。但是,我希望將所有內容都編寫成腳本,以便我可以更容易地重現。

我想過從R調用Python! (因爲它看起來好多了),但我試圖在R中完全做到這一點!

我寫了下面幾行

require("RCurl") 
result <- getURL("http://server",verbose=TRUE,ftp.use.epsv=TRUE, dirlistonly = TRUE) 

結果變量是字符類型:

typeof(result) 
[1] "character" 

示例內容如下:


有趣file_20150629.txt20八月2015 09:31 289K \ n有趣 file_20150630.txt20月,2015年09:31 293K \ nInteresting file_20150701.txt20月,2015年09:31 301K \ nInteresting file_20150702.txt20月,2015年09:31 304K \ nInteresting file_20150703.txt20月 - 2015年09 :31 301K \ nInteresting file_20150704.txt20 8 - 2015年9點31 300K \ nInteresting file_20150705.txt20 8 - 2015年9點31 300K \ nInteresting file_20150706.txt20 8 - 2015年9點31 305K \ nInteresting file_20150707 .txt20 Aug-2015 09:31 305K \ nInterresting file_20150708.txt20 Aug-2015 09:31 301K \ nInteresting file_20150709.txt20月,2015年09:31 294K \ n


\ n \ n \ n」個


所以現在,我試圖解析結果內容:

myFiles <- strsplit(result,'<a[^>]* href=\\"([^"]*.txt)\\"')[[1]] 

希望我會匹配txt文件(因爲它在括號:())。但它匹配:

">Interesting file_20150706.txt</a></td><td align=\"right\">20 Aug-2015 09:31 </td><td align=\"right\">305K</td></tr>\n<tr><td valign=\"top\"><img src=\"/apacheIcons/text.gif\" alt=\"[TXT]\"></td><td> 

改爲。

有什麼不對(我測試了我的表達https://regex101.com/)或(也許這個問題是更合適的)有更容易的方法來獲得在R服務器上具有特定擴展名的文件列表! ?

回答

3

你真的不應該在html上使用正則表達式。 XML包使得這非常簡單。我們可以使用getHTMLLinks()收集我們想要的任何鏈接。

library(XML) 
getHTMLLinks(result) 
# [1] "Interesting file_20150629.txt" "Interesting file_20150630.txt" 
# [3] "Interesting file_20150701.txt" "Interesting file_20150702.txt" 
# [5] "Interesting file_20150703.txt" "Interesting file_20150704.txt" 
# [7] "Interesting file_20150705.txt" "Interesting file_20150706.txt" 
# [9] "Interesting file_20150707.txt" "Interesting file_20150708.txt" 
# [11] "Interesting file_20150709.txt" 

這將讓包含在//a所有/@href鏈接。要只抓取那些包含.txt,您可以使用默認的不同XPath查詢。

getHTMLLinks(result, xpQuery = "//a/@href[contains(., '.txt')]") 

甚至更​​準確地說,獲取這些文件.txt,你可以做

getHTMLLinks(
    result, 
    xpQuery = "//a/@href['.txt'=substring(., string-length(.) - 3)]" 
) 
+1

很大的反響!我仍然不知道我的正則表達式中出了什麼問題,但是您的解決方案完美無缺! – matandked

+0

是的,很好的代碼。這幫助了我很多。特別是最後兩節。 –