在R中解析iTunes RSS

3
我正在尝试在R中解析iTunes的前100名,并输出艺术家、歌曲等信息,但我遇到了XML文件方面的问题。我想这是由于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个回答

2

问题在于您的XML文档具有默认命名空间,而您在xpath中没有考虑到这一点。不幸的是,在存在默认命名空间时,您需要在xpath中明确使用它。以下内容应该能够解决问题:

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

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


这更接近了,但我收到了很多“未定义命名空间前缀im on artist”的错误。我猜我需要使用一个参数来指向im:的某个地方,但是我的XML经验...好吧,今天是我第一次看它! - Kai Seward
我尝试了:xpathApply(xmlRoot(itunes.xml), "//d:entry", namespaces=c(d="http://www.w3.org/2005/Atom", im="http://itunes.apple.com/rss"))但是我仍然收到“命名空间前缀im未定义”的错误提示。 - Kai Seward
这并不是一个错误,而是一个警告。问题在于您正在提取一个命名空间不再定义的节点。这不应影响您处理节点的能力。但是,如果您使用xmlParse而不是xmlTreeParse,则不应该收到该警告。 - MrFlick
是的,我现在能够让事情运作了。我成功地使用了一种xmlTreeParse方法之后提取了我所需的内容,但这种方法似乎在xmlParse中不起作用,所以我现在只能容忍警告。谢谢! - Kai Seward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接