2017-09-03 30 views
0

我有一個代碼片段:在download.file中使用href和target?R?

raw_prefix <- file.path("data", "raw") 

fpa_prefix <- file.path(raw_prefix, "fpa-fod") 

if(!dir.exists(fpa_prefix)){ 
    dir.create(fpa_prefix) 
} 

fpa_gdb <- file.path(fpa_prefix, "RDS-2013-0009.4_GDB", "Data", "FPA_FOD_20170508.gdb") 

if (!file.exists(fpa_gdb)) { 
    loc <- "https://www.fs.usda.gov/rds/fedora/objects/RDS:RDS-2013-0009.4/datastreams/RDS-2013-0009.4_GDB/content" 
    dest <- paste0(fpa_prefix, ".zip") 
    download.file(loc, dest) 
    unzip(dest, exdir = fpa_prefix) 
    unlink(dest) 
    assert_that(file.exists(fpa_gdb)) 
} 

偉大的工程與大多數網站上下載的重複性工作流程的名稱飛文件,但有一個數據集,我需要它有一個「href」,該「目標」文件使得使用download.file()下載非常困難。

找到該文件(也在上面的代碼中)在這裏:

https://www.fs.usda.gov/rds/archive/Product/RDS-2013-0009.4/

實現頁面的底部是一個名爲

RDS-2013-0009.4 _GDB.zip

這是我正在嘗試使用上述腳本下載的文件。

如果你檢查這個元素,你會發現這個結構,它返回正確的文件!但如何翻譯成R代碼?

<a href="//www.fs.usda.gov/rds/fedora/objects/RDS:RDS-2013-0009.4/datastreams/RDS-2013-0009.4_GDB/content" target="_blank">RDS-2013-0009.4_GDB.zip</a>

如果任何人有關於如何下載這個文件我將不勝感激的想法!

謝謝!

+0

'目標='只是指示使用一個新的標籤/窗口/「會話」 – hrbrmstr

+0

謝謝你的瀏覽器澄清。但如果我只使用「https://www.fs.usda.gov/rds/fedora/objects/RDS:RDS-2013-0009.4/datastreams/RDS-2013-0009.4_GDB/content」它doens在R內工作在網絡瀏覽器中使用它是好的,但不是在R ... –

回答

2

這將:

  • 找到該網頁(URL和文件名)
  • 經過每一個找到並下載他們在所有.zip鏈接「就像一個瀏覽器會做」

請注意,write_disk()不會覆蓋現有文件,因此如果下載中斷,請刪除該文件或使用overwrite=TRUE

library(rvest) 
library(httr) 
library(purrr) 

pg <- read_html("https://www.fs.usda.gov/rds/archive/Product/RDS-2013-0009.4/") 

fils <- html_nodes(pg, xpath=".//dd[@class='product']//li/a[contains(., 'zip')]") 

walk2(html_attr(fils, 'href'), html_text(fils), 
     ~GET(sprintf("https:%s", .x), write_disk(.y), progress())) 

如果你不想使用purrr,這是所有基礎R:

invisible(
    mapply(
    download.file, 
     url = sprintf("https:%s", html_attr(fils, 'href')), 
     destfile = html_text(fils) 
) 
) 
+0

嗨hrbrmstr,這太棒了!謝謝你的多個例子,非常有幫助。我不反對使用嗚嗚聲,bu你能指導我一點嗎?儘管如此。什麼是「.x」和「.y」?在使用「.y」時,你在哪裏寫出文件?另外,在「xpath =」.// dd [@ class ='product'] // li/a [contains(。,'zip')]「)」部分,我可以指定「gdb」作爲唯一標識? –

+0

Nevermind,hbrrmstr。在使用「.y」時將它寫出來寫入。但是仍然無法弄清楚「.x」是指什麼...... –

+1

'.x'和'.y'是隱式定義的匿名函數中的變量。 '.x'是URL本身,'.y'是文件名。 – hrbrmstr

相關問題