RVest парсинг данных и заголовка изображения - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь очистить как данные, так и название изображения.

library(rvest) 

    test <- paste0("https://247sports.com/Season/2021-Football/Commits/?Page=", 1:38)
    
    test_data <- map_df(commits, ~.x %>% read_html %>%
                         html_nodes(".ri-page__star-and-score .score , .position , .ri-page__name-link") %>%
                         html_text() %>% 
                         str_trim %>% 
                         str_split("   ") %>% 
                         matrix(ncol = 3, byrow = T) %>% 
                         as.data.frame)

Это дает мне четыре поля данных, которые мне нужны. Но я также хочу получить заголовок изображения, который находится в:

<img alt="South Carolina" class="jsonly" src="https://s3media.247sports.com/Uploads/Assets/627/649/4649627.png?fit=bounds&amp;crop=50:50,offset-y0.50&amp;width=50&amp;height=50" title="South Carolina" style="opacity: 1;">

Итак, я хочу также извлечь либо alt, либо title, оба из которых дают мне имя (в этом примере это South Carolina ). Я знаю, как извлечь это как только заголовок, используя httr_attr, но я не знаю, как объединить их все вместе, так что всего пять полей.

1 Ответ

1 голос
/ 06 августа 2020

Вы можете получить заголовок:

library(rvest)
library(tidyverse)

test <- 'https://247sports.com/Season/2021-Football/Commits/?Page=1'

test_data$title <- test %>%
                    read_html %>%
                    html_nodes('div.status img') %>%
                    html_attr('title') %>%
                   .[c(TRUE, FALSE)]

test_data
#                    V1                  V2     V3   V4              title
#1           Kyle Ecker Committed: 8/5/2020     NA   OT          San Diego
#2     Josh Bertholotte Committed: 8/5/2020     NA  OLB             Hawaii
#3        Antario Brown Committed: 8/5/2020 0.8516   RB     South Carolina
#4       J'Kalon Carter Committed: 8/5/2020     NA   WR     Illinois State
#5       Stephon Dubose Committed: 8/5/2020     NA   OG       Old Dominion
#...

Я использую .[c(TRUE, FALSE)] для выбора альтернативных значений, потому что использование html_attr('title') возвращает каждое значение дважды.

Чтобы интегрировать его в функцию map, мы можем сделать:

all_data <- map_df(commits, ~{
             webpage <- .x %>% read_html
             df1 <-  webpage %>%
                    html_nodes(".ri-page__star-and-score .score ,.position ,.ri-page__name-link") %>%
                    html_text() %>% 
                    str_trim %>% 
                    str_split("   ") %>% 
                    matrix(ncol = 3, byrow = T) %>% 
                    as.data.frame
             df1$title <- webpage %>%
                            html_nodes('div.status img') %>%
                            html_attr('title') %>%
                           .[c(TRUE, FALSE)]
             df1
})
...