根据R中的节点路径列表从XML中提取节点

时间:2017-02-27 10:51:13

标签: r xml dataframe

我有一个XML文件,从中我从XML中提取了我想要grep的项目的路径。

如果提供的URL不起作用,可以在此处找到XML: Download XML

像这样:

library(XML)
dat <- read_xml(as.character("http://affi.voetbalshop.nl/google_create_unique.php"))
#dat_list <- dat %>% xml_find_all("//channel//item") %>% as_list()
dat_nodePaths <- dat %>% xml_find_all("//channel//item")
#dat_nodes <- dat %>% xml_find_all("//channel//item")
dat_paths <- xml_path(dat_nodePaths)

现在我想逐个提取每个路径并将它们添加到DataFrame中。如果我只将其应用于其中一条路径,那么我的DF只会偏离一行,但它确实有效。

l <- xml_find_first(dat, dat_paths[i]) %>% as_list()
df <- as.data.frame(t(unlist(l)), stringsAsFactors = F)

我之前尝试使用xml_find_all(),但这使我无法控制如何处理XML中的每个项目。

我目前的尝试是:

df <- rbind(for(i in 1:length(dat_paths)) {
  l <- xml_find_first(dat, dat_paths[i]) %>% as_list()
  as.data.frame(t(unlist(l)), stringsAsFactors = F)
  #df <- rbind(as.data.frame(t(unlist(l))))
})

尝试使用for循环内外的rbind。内部只给我最后一个对象(显然)。另一个只有Null。

如何从XML项目中获取格式良好的DataFrame?

3 个答案:

答案 0 :(得分:1)

library("httr")
library("XML")
URL <- "http://affi.voetbalshop.nl/google_create_unique.php"
temp <- tempfile(fileext = ".html")
GET(url = URL, user_agent("Mozilla/5.0"), write_disk(temp))

xpexpr <- "/rss/channel/item"
doc <- xmlParse( temp )
lNodes <- getNodeSet( doc, xpexpr )

a1 <- lapply(4:length(lNodes), function( y ) {
  xmlApply( xmlRoot( doc)[[1]][[y]], function(x) xmlSApply(x, xmlValue))
  })

b1 <- sapply( names(a1[[1]]), function( x ) t( sapply(a1, function( y ) y[[x]])))

names(b1)
# [1] "shipping"                "id"                      "title"                  
# [4] "description"             "product_type"            "google_product_category"
# [7] "link"                    "image_link"              "condition"              
# [10] "availability"            "price"                   "sale_price"             
# [13] "brand"                   "color"                   "age_group"              
# [16] "mpn"                     "item_group_id"           "gtin"                   
# [19] "custom_label_0"          "custom_label_1"          "custom_label_2"   

head(b1[['shipping']])
#      country service    price     
# [1,] "NL"    "Standard" "0.00 EUR"
# [2,] "NL"    "Standard" "0.00 EUR"
# [3,] "NL"    "Standard" "0.00 EUR"
# [4,] "NL"    "Standard" "0.00 EUR"
# [5,] "NL"    "Standard" "0.00 EUR"
# [6,] "NL"    "Standard" "0.00 EUR"

答案 1 :(得分:0)

感谢@mropa回答:R list to data frame

我能够构建我的数据框:

create_df_from_xml <- function(url) {
  library(xml2)
  library(plyr)
  library(dplyr)
  dat <- read_xml(as.character(url))
  dat_list <- dat %>% xml_find_all("//channel//item") %>% as_list()
  dat_nodePaths <- dat %>% xml_find_all("//channel//item")
  dat_paths <- xml_path(dat_nodePaths)
  tst <- lapply(dat_list, function(x) {unlist(x)})
  tst2 <- sapply(tst, function(x){rbind(unlist(x))})
  df <- ldply(tst2,data.frame)
  return(df)
}

希望这有助于将来的其他人!

答案 2 :(得分:-2)

试试这个

库(XML)

dat&lt; - read_xml(as.character(“http://affi.voetbalshop.nl/google_create_unique.php”))

doc&lt; - xmlTreeParse(dat,useInternal = TRUE)

rootNode&lt; - xmlRoot(doc)

xpathSApply(根节点, “// //频道项”,xmlValue)