Как очистить данные с нескольких страниц Википедии с помощью R? - PullRequest
0 голосов
/ 26 апреля 2020

Я новичок в очистке данных в 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 без ручного редактирования вышеуказанного кода?

1 Ответ

1 голос
/ 26 апреля 2020

добро пожаловать в SO.

Чтобы выполнить любую задачу несколько раз с помощью кода, вы всегда должны стремиться собрать al oop. Прежде чем вы сможете собрать al oop, вы должны попытаться построить одну итерацию l oop. Вы почти готовы к этому, но есть несколько пропущенных шагов.

Прежде всего, мы должны попытаться обобщить код, чтобы он мог работать, просто переключая значение одной переменной из вашего вектора итераторов. (знаменитости).

person <- "Tom Hanks"

Теперь, используя это, нам нужно создать ссылку на википедию через код. Здесь нужно учесть две вещи:

  1. Нам нужно добавить ссылку перед именем человека;
  2. Мы должны заменить пробел в "Томе Хэнксе" на подчеркивание

Мы можем сделать это с помощью этого кода:

link <- paste0("https://en.wikipedia.org/wiki/", 
               str_replace_all(person, " ", "_"))

Это создает правильную ссылку, которую мы можем использовать для последующих шагов. Теперь это просто вопрос итерации по вектору celebs. Есть много способов сделать это, но в R наиболее подходящим будет sapply. Для этого мы создадим анонимную функцию, которая будет принимать имя person в качестве входных данных, запрашивать википедию и извлекать их день рождения, используя код, который вы уже написали:

function(person) {
    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) {
    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)
})
...