在 R 中列出 HTTP/FTP 服务器上的文件

List files on HTTP/FTP server in R

我正在尝试从 R! 获取 HTTP/FTP 服务器上的文件列表,以便在下一步中我将能够下载它们(或 select 一些符合我要求的文件下载条件)。

我知道可以在网络浏览器(下载管理器)中使用外部程序,这将允许我从当前网络 page/ftp 下载 select 文件。但是,我希望所有的东西都有脚本,这样我就更容易重现了。

我考虑过从 R 调用 Python! (因为它似乎更容易),但我试图完全在 R 中做到这一点!

我写了以下几行

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

结果变量为字符类型:

typeof(result)
[1] "character"

示例内容如下:


Interesting file_20150629.txt20 Aug-2015 09:31 289K\nInteresting file_20150630.txt20 Aug-2015 09:31 293K\nInteresting file_20150701.txt20 Aug-2015 09:31 301K\nInteresting file_20150702.txt20 Aug-2015 09:31 304K\nInteresting file_20150703.txt20 Aug-2015 09:31 301K\nInteresting file_20150704.txt20 Aug-2015 09:31 300K\nInteresting file_20150705.txt20 Aug-2015 09:31 300K\nInteresting file_20150706.txt20 Aug-2015 09:31 305K\nInteresting file_20150707.txt20 Aug-2015 09:31 305K\nInteresting file_20150708.txt20 Aug-2015 09:31 301K\nInteresting file_20150709.txt20 Aug-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 中有更简单的方法来获取服务器上具有特定扩展名的文件列表! ?

你真的不应该在 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')]")

或者更准确地说,要获取 end.txt 的文件,您可以

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

不加载额外库的替代方法是将 ftp.use.epsv=FALSE 和 crlf = TRUE。这将指示 libcurl 将 \n's 更改为 \r\n's:

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

然后使用粘贴和 strsplit 将各个 URL 提取到文件,

result2 <- paste("http://server", strsplit(result, "\r*\n")[[1]], sep = "")