【问题标题】:Extract nodes from XML based on a list of nodepaths in R基于 R 中的节点路径列表从 XML 中提取节点
【发布时间】:2017-02-27 10:51:12
【问题描述】:

我有一个 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 只偏离了 1 行,但它可以工作。

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?

【问题讨论】:

  • 人们不太可能在那里有帐户。您应该粘贴 XML 文件的代表性工作示例。
  • @hrbrmstr 我认为此 XML 无需登录即可工作?我会将其上传到某处并将链接粘贴到问题中!谢谢!

标签: r xml dataframe


【解决方案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"

【讨论】:

  • 感谢@Sathish,这看起来是使用我的 xml 的更好方法!
  • 抱歉忘记了 ;-)。
【解决方案2】:

感谢@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)
}

希望这对未来的其他人有所帮助!

【讨论】:

    【解决方案3】:

    试试这个

    library(XML)
    
    dat <- read_xml(as.character("http://affi.voetbalshop.nl/google_create_unique.php"))
    
    doc<- xmlTreeParse(dat,useInternal=TRUE)
    
    rootNode <- xmlRoot(doc)
    
    xpathSApply(rootNode,"//channel//item",xmlValue)
    

    【讨论】:

    • 嗯...xpathSApply 没有按照 OP 的要求返回数据帧,并且此代码根本没有格式化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多