Как захватить html_nodes для meta с itemprop, равным определенному значению, используя rvest из tidyverse (используя R)

#r #tidyverse #rvest

#r #tidyverse #rvest

Вопрос:

 library(stringr);
library(rvest); 

denzel = read_html("https://www.imdb.com/filmosearch/?explore=title_typeamp;role=nm0000243amp;ref_=filmo_ref_typamp;sort=num_votes,descamp;mode=detailamp;page=1amp;title_type=movie");

titles = denzel %>%
            html_nodes(".lister-item-header a") %>%
            html_text();

titles;
  

Приведенный выше код захватывает список фильмов для Дензела Вашингтона. HTML-объект работает так, как ожидалось. Я получаю названия строк для 50 фильмов.

В частности, я хочу проанализировать следующие подэлементы в object.

 <meta itemprop="ratingValue" content="7.8" />
<meta itemprop="bestRating" content="10" />
<meta itemprop="ratingCount" content="383446" />
  

В приведенном выше случае я хочу извлечь ключи и значения для каждого … более конкретно, я знаю ключи, поэтому я хотел бы получить связанные значения…

 meta = denzel %>%
    html_nodes("meta") %>%
    html_attr("itemprop");

meta;
  

Это возвращает часть содержимого, но не то, что я хочу.

Приведенный ниже код не работает, это псевдокод,

 meta = denzel %>%
    html_nodes("meta") %>%
    html_attr("itemprop='ratingValue'");
  

В идеале meta (используя html_node или html_nodes) выдавала бы значение атрибута содержимого, передавая itemprop в качестве ключа.

Ответ №1:

Вы могли бы извлечь данные с помощью rvest , а затем некоторые манипуляции с данными с помощью dplyr могли бы помочь получить их в правильном формате.

 library(rvest)
library(dplyr)

data.frame(name = denzel %>% html_nodes("meta") %>% html_attr('itemprop'), 
           value = denzel %>% html_nodes("meta") %>% html_attr('content')) %>%
  filter(!is.na(name)) %>%
  mutate(movie_num = cumsum(name == 'ratingValue')) %>%
  tidyr::pivot_wider() %>%
  mutate(title = titles) %>%
  select(movie_num, title, everything()) %>%
  type.convert(as.is = TRUE)

#   movie_num title             ratingValue bestRating ratingCount
#       <int> <chr>                   <dbl>      <int>       <int>
# 1         1 American Gangster         7.8         10      383451
# 2         2 Training Day              7.7         10      381124
# 3         3 Inside Man                7.6         10      331364
# 4         4 The Equalizer             7.2         10      325088
# 5         5 Man on Fire               7.7         10      323563
# 6         6 Flight                    7.3         10      319627
# 7         7 Deja Vu                   7           10      288497
# 8         8 The Book of Eli           6.9         10      288067
# 9         9 Philadelphia              7.7         10      219506
#10        10 Safe House                6.7         10      202055
# … with 40 more rows