我是编程和 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/

10-12 04:16