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

Posted

技术标签:

【中文标题】在 R 中列出 HTTP/FTP 服务器上的文件【英文标题】:List files on HTTP/FTP server in R 【发布时间】:2015-11-19 17:22:02 【问题描述】:

我正在尝试从 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"

示例内容如下:


有趣的文件_20150629.txt20 Aug-2015 09:31 289K\n有趣 file_20150630.txt20 Aug-2015 09:31 293K\n有趣 file_20150701.txt20 Aug-2015 09:31 301K\n有趣 file_20150702.txt2015 年 8 月 09:31 304K\n有趣 file_20150703.txt2015 年 8 月 09:31 301K\n有趣 file_20150704.txt20 八月 2015 09:31 300K\n有趣 file_20150705.txt20 Aug-2015 09:31 300K\n有趣 file_20150706.txt20 Aug-2015 09:31 305K\n有趣 文件_20150707.txt2015 年 8 月 09:31 305K\n有趣 file_20150708.txt2015 年 8 月 09:31 301K\n有趣 file_20150709.txt2015 年 8 月 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 中服务器上具有特定扩展名的文件列表! ?

【问题讨论】:

【参考方案1】:

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

【讨论】:

很好的回应!我仍然不知道我的正则表达式出了什么问题,但是您的解决方案完美无缺!!! 是的,不错的代码。这对我帮助很大。尤其是最后两节。【参考方案2】:

不加载其他库的替代方法是将 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)

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

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

【讨论】:

以上是关于在 R 中列出 HTTP/FTP 服务器上的文件的主要内容,如果未能解决你的问题,请参考以下文章

用于在没有 -R 的 FTP 服务器上列出递归目录的 Bash 脚本

使用 Paramiko 在 Python 中列出与通配符匹配的 SFTP 服务器上的文件

linux上的文件管理类命令

在 R 中展平或取消列出数据框

如何通过 JDBC 驱动列出服务器上的 PostgreSQL 数据库?

基础管理类命