我是编程和r的新手,请我需要一点帮助。我的请求如此简单(我知道,我感到羞愧),因为你会很快解决。我正在做一个入侵植物物种的项目,我需要这个列表中的植物物种名称列表:http://www.issg.org/database/species/List.asp
物种的名称是超链接,我如何将名称提取到数据框或表中?
我一直在使用下面的代码提取链接,但是链接中的文本没有物种的名称:
url <- "http://www.issg.org/database/species/List.asp"
doc <- htmlParse(url)
links <- xpathSApply(doc, "//a/@href")
的链接文本是这样的:第一种(例如"ecology.asp?si=1590&fr=1&sts=&lang=EN
")第二种(例如"ecology.asp?si=1043&fr=1&sts=&lang=EN
")…
只是对@jdharrison的精彩回答的一个小小的、微不足道的修改。
library(XML)
url <- "http://www.issg.org/database/species/List.asp"
doc <- htmlParse(url)
links <- doc["//a[contains(@href,'ecology.asp?')]"]
df <- data.frame(names=sapply(links,xmlValue))
head(df)
# names
# 1 Abelmoschus moschatus
# 2 Abrus precatorius
# 3 Acacia concinna
# 4 Acacia confusa
# 5 Acacia farnesiana
# 6 Acacia longifolia
所以你不需要使用xpathApply(...)
;您可以使用[...]
中的XPath为XMLInternalDocument
对象"索引"。
links <- doc["//a[contains(@href,'ecology.asp?')]"]
生成满足XPath查询条件的节点的列表。然后,您可以使用sapply(...)
将xmlValue(...)
函数"应用"到列表中的每个元素。
df <- data.frame(names=sapply(links,xmlValue))
我们使用sapply(...)
,因为我们想要一个向量的结果,并在调用data.frame(...)
时将其转换为您要求的数据帧。
最后,我忍不住要评论一下"感到羞耻"这件事(尽管我肯定我会后悔的……)。你的问题提出得很好,很简洁,有一个代码示例,你提供了你的数据集(通过链接),你清楚地说明了你想要的结果。我在SO上看到的不到1%的问题是这样的,所以你应该感到相反的羞耻。
您可以在锚标记中搜索字符串ecology.asp?
,然后提取元素文本和href属性
url <- "http://www.issg.org/database/species/List.asp"
library(XML)
doc <- htmlParse(url)
links <- xpathApply(doc, "//a[contains(@href,'ecology.asp?')]"
, function(x){
data.frame(name = xmlValue(x), href = xmlGetAttr(x, "href"))
})
> head(do.call(rbind.data.frame, links))
name href
1 Abelmoschus moschatus ecology.asp?si=15&fr=1&sts=&lang=EN
2 Abrus precatorius ecology.asp?si=1609&fr=1&sts=&lang=EN
3 Acacia concinna ecology.asp?si=1343&fr=1&sts=&lang=EN
4 Acacia confusa ecology.asp?si=191&fr=1&sts=&lang=EN
5 Acacia farnesiana ecology.asp?si=49&fr=1&sts=&lang=EN
6 Acacia longifolia ecology.asp?si=1662&fr=1&sts=&lang=EN