8

我正在尝试从以下网页http://ipt.humboldt.org.co/中提取“样本”类型的链接。我可以使用以下代码从网页中获取表格:

library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
tableNodes<-getNodeSet(sitePage,"//table")
siteTable<-readHTMLTable(tableNodes[[1]])

但是,在我使用 readHTML 命令后链接丢失了。

4

2 回答 2

10

它最终成为一个复杂的 XPath 表达式:

library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
hyperlinksYouNeed<-getNodeSet(sitePage,"//table[@id='resourcestable']
                                        //td[5][.='Specimen']
                                        /preceding-sibling
                                        ::td[3]
                                        /a
                                        /@href")

但让我一点一点地解释 XPath 表达式:

  • //table[@id='resourcestable']-> 这样我们就可以在页面上获取名为“resourcestable”的主表

  • //td[5][.='Specimen']-> 现在我们只过滤那些类型为样本的行

  • /preceding-sibling-> 现在我们开始向后看

  • ::td[3]-> 3 个步骤可以从我们所在的位置精确倒数。小心前面的兄弟开始倒数,因此 td[1] 是Type列, td[2] 是Organization列, td[3] 是我们想要的Name列。

  • /a-> 现在获取包含节点

  • /@href-> 最后更准确地说是 href 属性内容

于 2012-09-06T00:55:14.327 回答
5
xmlFun<-function(x){
   y<-xpathSApply(x,'./a',xmlAttrs)
   if(length(y)>0){
      list(href=y,orig=xmlValue(x))
   }else{
      xmlValue(x)
   }
}
ans<-readHTMLTable(tableNodes[[1]],elFun=xmlFun,stringsAsFactors = FALSE)
ans$Name<-lapply(ans$Name,function(x){unlist(eval(parse(text=x)))})
ans$Name[ans$Subtype=='Specimen']
于 2012-09-07T15:39:35.470 回答