我对R中的数据抓取是陌生的,但是我想做以下事情。我有一个名人列表,celebs
,我想从维基百科获取他们的生日。我知道如何针对每个名人,但我正在尝试使这一过程动起来。
celebs <- c("Tom Hanks", "Tim Cook", "Michael Bloomberg")
我执行以下操作以获取第一位名人Tom Hanks
所需的信息。
library(rvest)
wiki <- read_html("https://en.wikipedia.org/wiki/Tom_Hanks")
birth_date <- wiki %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>%
html_text()
是否有一种无需手动编辑以上代码即可获取Tim Cook
和Michael Bloomberg
所需信息的方法?
谢谢你!
欢迎来到SO。>>
要重复使用代码执行任何任务,您应该始终寻找建立循环的方法。在构建循环之前,应尝试构建循环的单个迭代。您几乎已经准备就绪,但是缺少一些步骤。
首先,我们应该尝试对代码进行泛化,以便只需从迭代器(名人)的向量中切换一个变量的值就可以使代码起作用。
person <- "Tom Hanks"
现在,使用该代码,我们需要通过代码创建Wikipedia链接。这里有两件事要考虑:
我们可以使用以下代码执行此操作:
link <- paste0("https://en.wikipedia.org/wiki/", str_replace_all(person, " ", "_"))
这会创建正确的链接,我们可以将其用于后续步骤。现在,这只是迭代
celebs
向量的问题。有很多方法可以执行此操作,但是在R中,最合适的方法是使用sapply
。为此,我们将创建一个匿名函数,该函数将使用person
的名称作为输入,使用已编写的代码查询Wikipedia并提取其生日:
function(person) { person <- celebs[1] link <- paste0("https://en.wikipedia.org/wiki/", str_replace_all(person, " ", "_")) wiki <- read_html(link) birth_date <- wiki %>% html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>% html_text() return(birth_date) }
您现在可以在其周围包装
sapply
结构:
birthdates <- sapply(celebs, function(person) {
person <- celebs[1]
link <- paste0("https://en.wikipedia.org/wiki/",
str_replace_all(person, " ", "_"))
wiki <- read_html(link)
birth_date <- wiki %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>%
html_text()
return(birth_date)
})