rvest :: html_nodes возвращает частичный список (только несколько элементов) - PullRequest
2 голосов
/ 20 января 2020

Используя пакет rvest, я пытаюсь вычеркнуть имена актеров / актрис со страницы IMDB для фильма JFK (https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1).

SelectorGadget говорит, что место, которое я хочу искать имена «td: nth-child (2)» для каждого человека.

Вот код, который я использую.

        library(rvest)
        library(stringr)

        startFilm <- "tt0102138" #JFK
        personsNames <- c()
        pagePath <- paste("https://www.imdb.com/title/", startFilm, "/?ref_=nv_sr_1?ref_=nv_sr_1", sep = "")
        moviePage <- read_html(pagePath)
        personNodes <- html_nodes(moviePage, "td:nth-child(2)")
        personText <- html_text(personNodes)
        for (i in 1:length(personText)){
                actor <- (unlist(str_split(personText[i], "\n")))[2]
                personsNames[i] <- substring(actor, 2, nchar(actor))
        }
        personsNames

Согласно веб-сайту https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1 этот список должен быть довольно длинным.

Тем не менее, когда я запускаю код, я получаю только 15 имен.

[1] "Sally Kirkland"  "Anthony Ramirez" "Ray LePere"      "Steve Reed"      "Jodie Farber"    "Columbia Dubose"
[7] "Randy Means"     "Kevin Costner"   "Jay O. Sanders"  "E.J. Morris"     "Cheryl Penland"  "Jim Gough"
[13] "Perry R. Russo"  "Mike Longman"    "Edward Asner"

Почему список имен сокращается ?

Как мне настроить свой код, чтобы получить полный список актеров / актрис в фильме?

Ответы [ 2 ]

3 голосов
/ 20 января 2020

Вот что я сделал. Если вам просто нужны актеры / актрисы, вы можете запустить следующий код. Я определил указанное c местоположение. Таким образом, вы можете точно получить имена актеров / актрис; не нужно манипулировать строками.

library(rvest)
library(stringi)

read_html("https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1") %>% 
html_nodes("td.primary_photo") %>% 
html_nodes("img") %>% 
html_attr("alt")

#  [1] "Sally Kirkland"             "Anthony Ramirez"            "Ray LePere"                 "Steve Reed"                
#  [5] "Jodie Farber"               "Columbia Dubose"            "Randy Means"                "Kevin Costner"  
#[249] "Mark Edward Walters"        "Earl Warren"                "John B. Wells"              "Jim White"                 
#[253] "Phillip L. Willis"          "Rosemary Willis"            "Louis Steven Witt"          "Angus G. Wynne III"

В качестве бонуса, если вы хотите создать фрейм данных с именами и именами персонажей, вы можете попробовать следующее.

mydf <- tibble(actors = read_html("https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1") %>% 
                 html_nodes("td.primary_photo") %>% 
                 html_nodes("img") %>% 
                 html_attr("alt"),
               characters = read_html("https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1") %>% 
                 html_nodes(".character") %>% 
                 html_text() %>% 
                 stri_replace_all_regex(pattern = "\\n|\\s{2,}", replacement = ""))

#  actors          characters                             
#   <chr>           <chr>                                  
# 1 Sally Kirkland  Rose Cheramie                          
# 2 Anthony Ramirez Epileptic                              
# 3 Ray LePere      Zapruder                               
# 4 Steve Reed      John F. Kennedy - Double               
# 5 Jodie Farber    Jackie Kennedy - Double(as Jodi Farber)
# 6 Columbia Dubose Nellie Connally - Double               
# 7 Randy Means     Gov. Connally - Double                 
# 8 Kevin Costner   Jim Garrison                           
# 9 Jay O. Sanders  Lou Ivon                               
#10 E.J. Morris     Plaza Witness #1    
0 голосов
/ 20 января 2020

Вам нужно выполнить некоторую очистку данных после получения имен от html_nodes

url <- "https://www.imdb.com/title/tt0102138/fullcredits?ref_=tt_ql_1"
library(rvest)

url %>%
   read_html() %>%
   html_nodes("td:nth-child(2)") %>%
   html_text() %>%
   grep("...", ., invert = TRUE, value = TRUE, fixed = TRUE) %>%
   trimws %>%
  .[. != ""]

#  [1] "Sally Kirkland"             "Anthony Ramirez"            "Ray LePere"                
#  [4] "Steve Reed"                 "Jodie Farber"               "Columbia Dubose"      
#  [7] "Randy Means"                "Kevin Costner"              "Jay O. Sanders"   
# [10] "E.J. Morris"                "Cheryl Penland"             "Jim Gough"      
# [13] "Perry R. Russo"             "Mike Longman"               "Edward Asner"    
# [16] "Jack Lemmon"                "Vincent D'Onofrio"          "Gary Oldman"
#....
...