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

mat*_*ked 4 regex r text-parsing html-parsing

我正在尝试从R!获取HTTP/FTP服务器上的文件列表,以便下一步我可以下载它们(或选择一些符合我的标准的文件下载).

我知道可以在Web浏览器(下载管理器)中使用外部程序,这将允许我从当前网页/ ftp中选择要下载的文件.但是,我希望将所有内容编写成脚本,这样我才能更容易地重现.

我想过从R调用Python!(因为它似乎更容易),但我试图在R完全这样做!

我写了以下几行

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

结果变量是字符类型:

typeof(result)
[1] "character"
Run Code Online (Sandbox Code Playgroud)

样本内容如下:


有趣的file_20150629.txt20 2015年8月09:31 289K \n感兴趣file_20150630.txt20 2015年8月09:31 293K \n感兴趣file_20150701.txt20 Aug-2015 09:31 301K \n感兴趣file_20150702.txt20 Aug-2015 09:31 304K \n感兴趣的文件_20150703 .txt20 Aug-2015 09:31 301K \n感兴趣file_20150704.txt20 Aug-2015 09:31 300K \n感兴趣file_20150705.txt20 2015年8月09:31 300K \n感兴趣file_20150706.txt20 Aug-2015 09:31 305K \n感兴趣file_20150707.txt20 2015年8月09:31 305K \n感兴趣file_20150708.txt20 Aug-2015 09:31 301K \n感兴趣file_20150709.txt20 Aug-2015 09:31 294K \n


\n \n \n"


所以现在,我正在尝试解析结果内容:

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

希望我能匹配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>
Run Code Online (Sandbox Code Playgroud)

代替.

有什么问题(我在https://regex101.com/上测试了我的表达式)或(也许这个问题更合适)有更简单的方法来获取R中服务器上具有特定扩展名的文件列表!?

Ric*_*ven 8

你真的不应该在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"  
Run Code Online (Sandbox Code Playgroud)

这将/@href包含所有链接//a.要仅捕获包含 的那些.txt,您可以使用默认的不同XPath查询.

getHTMLLinks(result, xpQuery = "//a/@href[contains(., '.txt')]")
Run Code Online (Sandbox Code Playgroud)

甚至更准确地说,让那些文件结尾.txt,你可以做

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

  • 反应很好!我仍然不知道我的正则表达式出了什么问题,但你的解决方案工作完美! (2认同)