2017-01-16 21 views
1

我確實有一個關於從某個xml文檔(http://www.bundestag.de/xml/mdb/index.xml)中獲取信息的問題。刮一個xml文檔(嵌套的url結構)

<mdbUebersicht> 
<dokumentInfo> 
<dokumentURL/> 
<dokumentStand/> 
</dokumentInfo> 
<deleteRestore> 
<deleteFlag>0</deleteFlag> 
<deleteDate>20131202170000</deleteDate> 
</deleteRestore> 
<mdbs> 
<mdb fraktion="Die Linke"> 
<mdbID status="Aktiv">1627</mdbID> 
<mdbName status="Aktiv">Aken, Jan van</mdbName> 
<mdbBioURL> 
http://www.bundestag.de/abgeordnete18/biografien/A/aken_jan/258124 
</mdbBioURL> 
<mdbInfoXMLURL> 
http://www.bundestag.de/xml/mdb/biografien/A/aken_jan.xml 
</mdbInfoXMLURL> 
<mdbInfoXMLURLMitmischen>/biografien/A/aken_jan.xml</mdbInfoXMLURLMitmischen> 
<mdbLand>Hamburg</mdbLand> 
<mdbFotoURL> 
http://www.bundestag.de/blueprint/servlet/image/240714/Hochformat__2x3/177/265/83abda4f387877a2b5eeedbfd81e8eba/Yc/aken_jan_gross.jpg 
</mdbFotoURL> 
<mdbFotoGrossURL> 
http://www.bundestag.de/blueprint/servlet/image/240714/Hochformat__2x3/316/475/83abda4f387877a2b5eeedbfd81e8eba/Uq/aken_jan_gross.jpg 
</mdbFotoGrossURL> 
<mdbFotoLastChanged>24.10.2016</mdbFotoLastChanged> 
<mdbFotoChangedDateTime>24.10.2016 12:17</mdbFotoChangedDateTime> 
<lastChanged>30.09.2016</lastChanged> 
<changedDateTime>30.09.2016 12:38</changedDateTime> 
</mdb> 

該文件包含很多不同的人的簡短的傳記方面。除此之外,它包含其他XML文檔的URL,其中包含更詳細的傳記。

我嘗試以下方法來獲取信息:

首先,我試着去理解不同的子文檔中的所有網址從maindocument

mdb_url <- xml_text(xml_find_all(xmlDocu, "//mdbInfoXMLURL")) 

然後,我實現了一個for循環,其下載所有XML在我的目錄

for (url in mdb_url) { 
    download.file(url, destfile = basename(url)) 
} 

後來我想收到的文件列表...

files <- list.files(pattern = ".xml") 

......讓每一個XML文檔的特定節點:

Bio1 <- files[1] 

xmlfile <- read_xml(Bio1) 

mdb_ausschuss1 <- xml_text(xml_find_all(xmlfile, "//gremiumName")) 

現在我有我如何爲列表中的所有XML文件做了什麼問題?我一直無法編寫該任務的功能循環或腳本...

回答

1
library(xml2) 
library(httr) 
library(rvest) 
library(tools) 
library(tidyverse) 

從主站點XML

URL <- "http://www.bundestag.de/xml/mdb/index.xml" 
doc <- read_xml(URL) 
xml_find_all(doc, "//mdbInfoXMLURL") %>% xml_text() -> mdb_urls 

獲取URL列表中創建一個地方來存儲他們:

dir.create("docs") 

把它們寫在磁盤(我只抓住其中的10個,因爲我並不需要的數據,你做:-)

注ŧ除非被告知,否則帽子write_disk()不會覆蓋路徑,所以這是做窮人緩存的好方法。如果你把它放在一個可複製的腳本中,你必須嘗試/ catch包裝它。

walk(mdb_urls[1:10], ~GET(., write_disk(file.path("docs", basename(.))))) 

獲取文件列表:

fils <- list.files("docs", pattern=".*.xml", full.names=TRUE) 

把它變成一個數據幀:

pb <- progress_estimated(length(fils)) # use a progress bar 
map_df(fils, function(x) { 

    pb$tick()$print() # increment the progress bar 

    gremium_doc <- read_xml(x) # read in the file 

    # find all the `gremiumName`s. If there are none, make the value `NA` 
    xml_find_all(gremium_doc, "//gremiumName") %>% xml_text() -> g_names 
    if (length(g_names) == 0) g_names <- NA_character_ 

    # make a tidy data frame 
    data_frame(gremium=file_path_sans_ext(basename(x)), name=g_names) 

}) -> df 

證明它的工作原理

glimpse(df) 
## Observations: 33 
## Variables: 2 
## $ gremium <chr> "aken_jan", "aken_jan", "aken_jan", "aken_jan", "alban... 
## $ name <chr> "Auswärtiger Ausschuss", "Gremium nach § 23c Absatz 8 ... 
+0

的偉大工程!非常感謝! –

+0

也許你可以幫我上一次:在那種情況下,我怎麼能把數據結構從long變成wide?從這個意義上說,對於每一個新的銅都有一個新的屬性(「AuswärtigerAusschuss」,「Wirtschafts Ausschuss」等)的「真」或「不」。我嘗試了resphape命令,但我沒有到達那裏。 –

+0

完全獨立的問題(SO規則/指導方針建議shld是新q) – hrbrmstr