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