我有一个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?
答案 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)