从HTML表格中提取链接

8
我正在尝试从以下网页中提取类型为“标本”的链接:http://ipt.humboldt.org.co/。我可以使用以下代码从网页获取表格:
library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
tableNodes<-getNodeSet(sitePage,"//table")
siteTable<-readHTMLTable(tableNodes[[1]])

然而,当我使用readHTML命令后,链接已经丢失。
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'] -> 现在我们只过滤出这些类型为Specimen的行。

  • /preceding-sibling -> 现在我们开始向后查找。

  • ::td[3] -> 精确地说,我们从当前位置向后数3步。请注意,preceding-sibling从后往前计算,因此td[1]是Type列,td[2]是Organisation列,而td[3]是我们想要的Name列。

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

  • /@href -> 最后精确定位到href属性内容。


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']

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