我正在尝试从以下网页http://ipt.humboldt.org.co/中提取“样本”类型的链接。我可以使用以下代码从网页中获取表格:
library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
tableNodes<-getNodeSet(sitePage,"//table")
siteTable<-readHTMLTable(tableNodes[[1]])
但是,在我使用 readHTML 命令后链接丢失了。
我正在尝试从以下网页http://ipt.humboldt.org.co/中提取“样本”类型的链接。我可以使用以下代码从网页中获取表格:
library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
tableNodes<-getNodeSet(sitePage,"//table")
siteTable<-readHTMLTable(tableNodes[[1]])
但是,在我使用 readHTML 命令后链接丢失了。
它最终成为一个复杂的 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 属性内容
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']