我正在尝试解析R中的iTunes前100名,并吐出艺术家,歌曲等等,但我猜这个XML文件存在问题。我能够通过Billboard的RSS(http://www1.billboard.com/rss/charts/hot-100)
轻松获得可用数据GetBillboard <- function() {
hot.100 <- xmlTreeParse("http://www1.billboard.com/rss/charts/hot-100")
hot.100 <- xpathApply(xmlRoot(hot.100), "//item")
top.songs <- character(length(hot.100))
for(i in 1:length(hot.100)) {
top.songs[i] <- xmlSApply(hot.100[[i]], xmlValue)[3]
}
return(top.songs)
}
尝试使用iTunes的类似策略(https://itunes.apple.com/us/rss/topmusicvideos/limit=100/explicit=true/xml)
GetITunes <- function() {
itunes.raw <- getURL("https://itunes.apple.com/us/rss/topmusicvideos/limit=100/explicit=true/xml")
itunes.xml <- xmlTreeParse(itunes.raw)
top.vids <- xpathApply(xmlRoot(itunes.xml), "//entry")
return(top.vids)
}
我只是胡说八道:
> m <- GetITunes()
> m
list()
attr(,"class")
[1] "XMLNodeSet"
>
我猜它是XML文件的格式。在第一个函数中,如何让这些iTunes数据与Billboard中的数据类似?
hot.100 <- xpathApply(xmlRoot(hot.100), "//item")
谢谢!
答案 0 :(得分:2)
问题是您的XML文档具有默认命名空间,并且您没有在xpath中考虑这一点。不幸的是,当存在默认命名空间时,您需要明确在xpath中使用它。这应该工作
xpathApply(xmlRoot(itunes.xml), "//d:entry",
namespaces=c(d="http://www.w3.org/2005/Atom"))
这里我们任意选择d
指向XML文档中使用的默认命名空间,然后在我们的xpath表达式中使用该前缀。