2015-08-25 25 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

是的,很好的代码。这帮助了我很多。特别是最后两节。 –