我是编程和 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(...)
;您可以使用 XMLInternalDocument
中的 XPath 来“索引”一个 [...]
对象。links <- doc["//a[contains(@href,'ecology.asp?')]"]
这将生成满足 XPath 查询条件的节点列表。然后,您可以使用
xmlValue(...)
将 sapply(...)
函数“应用”到列表中的每个元素。df <- data.frame(names=sapply(links,xmlValue))
我们使用
sapply(...)
是因为我们想要一个向量作为结果,并在调用 data.frame(...)
时将其扭曲,以按照您的要求将其转换为数据帧。最后,我忍不住要评论一下这种“感到羞耻”的事情(虽然我肯定我会后悔的......)。您的问题提出得很好,简洁,有一个代码示例,您提供了您的数据集(通过链接),并清楚地说明了您想要的结果。我在 SO 上看到的问题中只有不到 1% 是这样的,所以你应该感到羞耻。
关于html - 网页抓取 : how extract the text (names) in the hyperlinks in a web page?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24187470/