我正在尝试从以下类型为“Specimen”的网页http://ipt.humboldt.org.co/中提取链接。我可以使用以下代码从网页上获取表格:
library(XML)
sitePage<-htmlParse("http://ipt.humboldt.org.co/")
tableNodes<-getNodeSet(sitePage,"//table")
siteTable<-readHTMLTable(tableNodes[[1]])
但是,在使用readHTML命令后,链接丢失了。
答案 0 :(得分: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']
- &gt;这样我们就可以在名为“resourcestable”
//td[5][.='Specimen']
- &gt;现在我们只过滤那些Type为 Specimen
/preceding-sibling
- &gt;现在我们开始向后看
::td[3]
- &gt;从我们所处的位置向后精确计算3个步骤。注意前兄弟开始向后计数,因此td [1]是 Type 列,td [2]是 Organization 列和td [ 3]是我们想要的 Name 列。
/a
- &gt;现在获取包含的 a 节点
/@href
- &gt;最后更确切地说是href属性内容
答案 1 :(得分: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']