列出网页中的数据网址

时间:2014-08-08 08:59:18

标签: html r url download

为了自动下载网页中显示的所有文件(数据网址与网页网址不同),我必须从html代码中提取这些数据网址。 我是这样做的:

library(XML)
url <- "http://www.data.gouv.fr/fr/dataset/registre-parcellaire-graphique-2012-contours-des-ilots-culturaux-et-leur-groupe-de-cultures-majorita"
doc <- htmlParse(url)

doc中,我要检索此div中的数据网址:

<div class="list-group-item" data-url="https://www.data.gouv.fr/storage/f/2014-02-13T13-50-47/RPG_2012_087.zip" data-format="shp" rel="popover" data-trigger="hover" data-placement="top" title="Registre Parcellaire Graphique 2012 - Département de la Haute-Vienne (87) [shp]" data-content="Registre Parcellaire Graphique 2012 - Département de la Haute-Vienne (87)">

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

正如理查德所提到的,帮助页面提供了许多示例作为演示。如果我们知道链接的模式,例如我们的案例<div class="list-group-item",我们可以尝试以下

library(XML)
url <- "http://www.data.gouv.fr/fr/dataset/registre-parcellaire-graphique-2012-contours-des-ilots-culturaux-et-leur-groupe-de-cultures-majorita"

#Save and read html file,replace the filname here 
doc <- htmlTreeParse('doc_fr.htm',useInternalNodes = TRUE)

#The pattern required for subsetting links
doc_nodes=xpathSApply(doc,"//div[@class='list-group-item']",xmlAttrs)
row.names(doc_nodes)
#[1] "class"          "data-url"       "data-format"    "rel"            "data-trigger"   "data-placement"
#[7] "title"          "data-content"

#The links are present in second row from above
doc_links=doc_nodes[2,]

head(doc_links,5)
#[1] "https://www.data.gouv.fr/storage/f/2014-02-12T09-44-05/Description_RPG_2012_SHP.rtfd.zip"                 
#[2] "https://www.data.gouv.fr/storage/f/2014-02-12T09-50-50/RPG_2012_%20Codes_groupes_cultures_et_couleurs.csv"
#[3] "https://www.data.gouv.fr/storage/f/2014-02-12T09-57-24/RPG_2012_001.zip"                                  
#[4] "https://www.data.gouv.fr/storage/f/2014-02-12T13-26-51/RPG_2012_002.zip"                                  
#[5] "https://www.data.gouv.fr/storage/f/2014-02-12T13-28-03/RPG_2012_02A.zip"

#Get file names from links
unique(do.call(rbind,lapply(strsplit(doc_links,split="/"),function(x) length(x))))
#     [,1]
#[1,]    7

#replace space with underscore in output file name
raw_fnames=do.call(rbind,lapply(strsplit(doc_links,split="/"),function(x) x[7] ))
raw_fnames=gsub('%20',' ',raw_fnames)
new_fnames=gsub(' ','_',raw_fnames)

#Download all files
lapply(1:length(new_fnames),function(x)  download.file(doc_links[x],destfile=new_fnames[x]) )
#trying URL 'https://www.data.gouv.fr/storage/f/2014-02-12T09-44-05/Description_RPG_2012_SHP.rtfd.zip'
#Content type 'application/zip' length 128101 bytes (125 Kb)
#opened URL
#downloaded 125 Kb

答案 1 :(得分:1)

试一试。它返回URL页面上的所有链接。这个答案几乎是从htmlParse帮助文件中逐字逐句地得出的。 getLinks函数非常有用。

> library(XML)
> getLinks <- function() { 
       links = character() 
       list(a = function(node, ...) { 
                   links <<- c(links, xmlGetAttr(node, "href"))
                   node 
                }, 
            links = function()links)
     }
> h1 <- getLinks()
> htmlTreeParse(url, handlers = h1)
> h1$links()

要获取包含单词&#34; data&#34;的所有网址,您可以

h1$links()[grepl("data", h1$links())]