gpt4 book ai didi

xml - 使用 XML/RCurl R 包解析 HTML 表,而不使用 readHTMLTable 函数

转载 作者:数据小太阳 更新时间:2023-10-29 02:21:11 25 4
gpt4 key购买 nike

我正在尝试从单个 html 表中抓取/提取数据:http://www.theplantlist.org/tpl/record/kew-419248和一些非常相似的页面。我最初尝试使用以下函数来读取表格,但它并不理想,因为我想将每个物种名称分成其组成部分(属/种/亚种/作者等)。

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( "", "物种", ""))]

对于亚种等级://*[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)

但是,这种方法存在问题,因为数据存在间隙(例如,表中只有某些行具有种内等级,因此我返回的只是表中三个等级的列表,没有间隙)。数据输出也是我无法附加到数据框的类。

有谁知道从该表中将信息提取到数据框中的更好方法?

如有任何帮助,我们将不胜感激!

汤姆

最佳答案

这是另一种解决方案,它将每个物种名称拆分成其组成部分

library(XML)
library(plyr)

# read url into html tree
url = "http://www.theplantlist.org/tpl/record/kew-419248"
doc = htmlTreeParse(url, useInternalNodes = T)

# extract nodes containing desired information
xp_expr = "//table[@class= 'names synonyms']/tbody/tr"
nodes = getNodeSet(doc, xp_expr)

# function to extract desired fields from a given node
fields = list('genus', 'species', 'infraspe', 'authorship')
read_node = function(node){

dl = lapply(fields, function(x) xpathSApply(node,
paste(".//*[@class = ", "'", x, "'", "]", sep = ""), xmlValue))
tmp = rep(' ', length(dl))
tmp[sapply(dl, length) == 1] = unlist(dl)
confidence = xpathSApply(node, './/img', xmlGetAttr, 'alt')
return(c(tmp, confidence))
}

# apply function to all nodes and return data frame
df = ldply(nodes, read_node)
names(df) = c(fields, 'confidence')

它产生以下输出

 genus      species     infraspe                      authorship confidence
1 Critesion chilense (Roem. & Schult.) Ã\u0081.Löve H
2 Hordeum chilense chilense L
3 Hordeum cylindricum Steud. H
4 Hordeum depauperatum Steud. H
5 Hordeum pratense brongniartii Macloskie L
6 Hordeum secalinum chilense Ã\u0089.Desv. L

关于xml - 使用 XML/RCurl R 包解析 HTML 表,而不使用 readHTMLTable 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6427061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com