【发布时间】:2011-09-19 14:26:59
【问题描述】:
我正在尝试从http://www.theplantlist.org/tpl/record/kew-419248 和许多非常相似的页面上的单个 html 表中抓取/提取数据。 我最初尝试使用以下函数来读取表格,但这并不理想,因为我想将每个物种名称分成其组成部分(属/物种/亚种/作者等)。
library(XML)
readHTMLTable("http://www.theplantlist.org/tpl/record/kew-419248")
我使用 SelectorGadget 为我要提取的每个表元素标识一个唯一的 XPATH(不一定是最短的):
对于属名: //[contains(concat( " ", @class, " " ), concat( " ", "Synonym", " " ))]// [包含(concat(“”,@class,“”),concat(“”,“属”,“”))]
对于物种名称: //[contains(concat( " ", @class, " " ), concat( " ", "Synonym", " " ))]//[contains( concat( " ", @class, " "), concat(" ", "species", " "))]
对于亚种等级: //*[contains(concat( " ", @class, " " ), concat( " ", "infraspr", " " ))]
对于基础物种名称: //*[contains(concat( " ", @class, " " ), concat( " ", "infraspe", " " ))]
对于置信度(图像): //[contains(concat( " ", @class, " " ), concat( " ", "synonyms", " " ))]//img 对于来源: //[contains(concat( " ", @class, " "), concat(" ", "source", " "))]//a
我现在想将信息提取到数据框/表格中。
我尝试使用 XML 包的 xpathSApply 函数来提取其中一些数据:
例如对于亚种等级
library(XML)
library(RCurl)
infraspeciesrank = htmlParse(getURL("http://www.theplantlist.org/tpl/record/kew-419248"))
path=' //*[contains(concat( " ", @class, " " ), concat( " ", "infraspr", " " ))]'
xpathSApply(infraspeciesrank, path)
但是,由于数据中的间隙,此方法存在问题(例如,表中只有某些行具有亚种等级,所以我返回的只是表中三个等级的列表,没有间隙)。数据输出也是我无法附加到数据框的类。
有谁知道从该表中提取信息到数据框中的更好方法?
任何帮助将不胜感激!
汤姆
【问题讨论】:
-
快速建议:将完整的 HTML 作为字符串读取,然后简单地应用正则表达式(根据我的经验,HTML 很容易受到这种影响)。先用表隔离部分,再做子结构...
标签: xml r html-parsing web-scraping rcurl