如何使用tidyverse的RVest使用R为itemprop等于特定值的元抓取html_nodes使用R

问题描述

library(stringr);
library(rvest); 

denzel = read_html("https://www.imdb.com/filmosearch/?explore=title_type&role=nm0000243&ref_=filmo_ref_typ&sort=num_Votes,desc&mode=detail&page=1&title_type=movie");

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

titles;

以上代码摘录了丹泽尔·华盛顿的电影清单。 HTML对象按预期方式工作。我得到了50部电影的字符串名称标题

具体来说,我想解析对象中的以下子元素。

<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'");

理想情况下,元数据(使用html_node或html_nodes)将通过传递itemprop作为键来吐出内容属性值。

解决方法

您可以使用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