在R中解析iTunes RSS

时间:2014-08-27 02:20:06

标签: xml r xml-parsing rss

我正在尝试解析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")

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您的XML文档具有默认命名空间,并且您没有在xpath中考虑这一点。不幸的是,当存在默认命名空间时,您需要明确在xpath中使用它。这应该工作

xpathApply(xmlRoot(itunes.xml), "//d:entry", 
    namespaces=c(d="http://www.w3.org/2005/Atom"))

这里我们任意选择d指向XML文档中使用的默认命名空间,然后在我们的xpath表达式中使用该前缀。