R-RVest-删除p中的所有数据(IMDb页上的导演)

时间:2019-08-21 09:40:02

标签: r web-scraping rvest

我正在尝试从IMDb网页上删除电影详细信息。 问题出在Directors数据上。我只可以抓取第一名导演,但想在每部电影中抓取所有这些。

在下面提到的位置10的页面上,我们有“复仇者联盟-无限战争”,其中的导演是安东尼·鲁索和乔·鲁索。

代码的原始版本。 如您所见,有一个特定的子级设置为1,所以它读的是第一任导演。

directors_data<- html_node(szczegoly_filmu,'.text-muted+ p a:nth-child(1)')
directors_data <- html_text(directors_data)

我可以将其更改为2,但是结果将是大多数行都是空的,因为只提到了一个导演。而且只有几部电影的导演不止一位。

我试图更新代码。

director_data<- html_node(szczegoly_filmu,'.text-muted+ p a')
director_data <- html_text(director_data)

但是它也只读取第一个条目。

整个代码

library(rvest)

url<-"https://www.imdb.com/search/title/?title_type=feature&release_date=,2018-12-31&count=250&start="

ile<-seq(from=1, by=250, length.out = 2)

filmy_df=data.frame()

for (j in ile){
  #otworzenie strony w przegladarce
  newURL<-"https://www.imdb.com/search/title/?title_type=feature&release_date=,2018-12-31&count=250&start="
  startNumberURL<-paste0(newURL,j)

#odczytanie kodu strony
strona_imdb<-read_html(startNumberURL)

#ograniczenie do czesci zawierajacej szczegoly
szczegoly_filmu <- html_nodes(strona_imdb, '.lister-item-content')

#odczytanie sekcji z rankingiem
rank_data<-html_node(szczegoly_filmu,'.text-primary')
#konwersja rankingu na text
rank_data<-html_text(rank_data)
#usuniecie przecinka rozdzielajacego tysiace
rank_data<-gsub(",","",rank_data)
#konwersja na numeric
rank_data<-as.numeric(rank_data)

link<-html_node(szczegoly_filmu,'.lister-item-header a')%>%html_attr(.,'href')
link<-url_absolute(link,"https://www.imdb.com")

#odczytanie unikatowego IMDBid (tytuly moga sie powtarzac, a linkow nie bedziemy zliczac)
imdbID<-sapply(strsplit(link, '/'),function(x) x[5])

#odczytanie tytulu
title_data<-html_node(szczegoly_filmu,'.lister-item-header a')
#konwersja tytulu na text
title_data<-html_text(title_data)
#title_data<-as.character(title_data)


directors_data<- html_node(szczegoly_filmu,'.text-muted+ p a:nth-child(1)')
directors_data <- html_text(directors_data)

director_data_h<- html_node(szczegoly_filmu,'.text-muted+ p a')
director_data <- html_text(director_data_h)


#utworzenie tymczasowej ramki dla iteracji
filmy_df_temp<-data.frame(Dir=director_data,Rank=rank_data,IMDBid=imdbID,Title=title_data,Directors=directors_data)

#wczytanie df z iteracji do koncowej ramki
filmy_df<-rbind(filmy_df,filmy_df_temp)
}

没有任何错误。只是想扩展功能。

1 个答案:

答案 0 :(得分:0)

在应用html_text()之后,您可以通过字符串操作来获取值。即使看起来有些混乱,它也可以解决问题。

...
   ...

directors_data  <-  szczegoly_filmu %>% 
                    html_node('.text-muted+ p') %>% 
                    html_text()%>%
                    gsub("[|]","",.) %>%
                    gsub(".*Directors:","",.)  %>%  
                    gsub(".*Director:","",.) %>%
                    gsub("Stars:.*","",.)%>% 
                    gsub("[\n]", "", .) %>%  
                    gsub("^\\s+|\\s+$", "", .)
...
   ...

给予

                   Dir Rank    IMDBid                             Title                                     Directors
1            James Wan    1 tt1477834                           Aquaman                                     James Wan
2        David Raymond    2 tt6533240                             Nomis                                 David Raymond
3      Bob Persichetti    3 tt4633694 Spider-Man: Into the Spider-Verse Bob Persichetti, Peter Ramsey, Rodney Rothman
4    Quentin Tarantino    4 tt0361748              Inglourious Basterds                             Quentin Tarantino
5    Quentin Tarantino    5 tt0110912                      Pulp Fiction                             Quentin Tarantino
6      Andy Muschietti    6 tt1396484                                It                               Andy Muschietti
7  Lesli Linka Glatter    7 tt0114011                      Now and Then                           Lesli Linka Glatter
8         Bryan Singer    8 tt1727824                 Bohemian Rhapsody                                  Bryan Singer
9    Quentin Tarantino    9 tt3460252                 The Hateful Eight                             Quentin Tarantino
10       Anthony Russo   10 tt4154756            Avengers: Infinity War                      Anthony Russo, Joe Russo