работа со словарем и очистка веб-страниц с использованием Python (BeautifulSoup)

#python

#python

Вопрос:

Моя цель — получить словарь, в котором ключами будут различные жанры фильмов, перечисленные на странице URL, а значениями будут сами фильмы.

У меня есть две вещи, которые я хотел бы сделать. Сначала я хотел бы закончить список жанров, когда появится опция «Вестерн», поэтому я установил это условие if. Кроме того, я хотел бы получить список фильмов для каждого пола вместо того, чтобы не получать ни одного.

Заранее спасибо.

 import requests 
from bs4 import BeautifulSoup

url_movies_by_genre = "https://www.imdb.com/feature/genre/?ref_=nv_ch_gr"
req2 = requests.get(url_movies_by_genre, timeout=4) 
source_movies_genre = req2.text 

html2 = BeautifulSoup(source_movies_genre,"html") 

dict_movies_by_genre = dict()
for each in html2.findAll('div',class_= 'table-cell primary'):
    dict_movies_by_genre[each.find('a').text.strip()] = each.get('href')
    if dict_movies_by_genre[each.find('a').text.strip()] == 'Western':
        break
print(dict_movies_by_genre)
 

Результат моего кода таков:

 {' Action ': None, ' Adventure ': None, ' Animation ': None, ' Biography ': None, ' Comedy ': None, ' Crime ': None, ' Documentary ': None, ' Drama ': None, ' Family ': None, ' Fantasy ': None, ' Film Noir ': None, ' History ': None, ' Horror ': None, ' Music ': None, ' Musical ': None, ' Mystery ': None, ' Romance ': None, ' Sci-Fi ': None, ' Short Film ': None, ' Sport ': None, ' Superhero ': None, ' Thriller ': None, ' War ': None, ' Western ': None, ' Game Show ': None, ' News ': None, ' Reality-TV ': None, ' Talk Show ': None, ' Reality TV ': None, ' Sports ': None, ' Anime ': None, ' Avant-Garde ': None, ' B-Movie ': None, ' Chick Flick ': None, ' Coming of Age ': None, ' Cult Film ': None, ' Dystopia ': None, ' Epic ': None, ' Espionage ': None, ' Femme Fatale ': None, ' High School ': None, ' Kung Fu ': None, ' Mockumentary ': None, ' Post-Apocalypse ': None, ' Spoof ': None, ' Supernatural ': None, ' Time Travel ': None, ' Vampire ': None, ' Zombie ': None, ' Browse/Search by keyword ': None, ' Most Popular Movies ': None, ' Top Rated Movies ': None, ' Top Rated Indian Movies ': None, ' Most Popular Future Movies ': None, ' Most Popular TV ': None, ' Top Rated TV ': None, ' Most Popular Future TV ': None, ' Short ': None}
 

Ответ №1:

проблема проста, что ссылка находится внутри подтега a

 >>> f=html.findAll("div",class_= 'table-cell primary')
>>> t=f[0]
>>> t
<div class="table-cell primary"> <a href="/search/title?genres=actionamp;amp;title_type=featureamp;amp;explore=genresamp;amp;pf_rd_m=A2FGELUUNOQJNLamp;amp;pf_rd_p=facfbd0c-6f3d-4c05-9348-22eebd58852eamp;amp;pf_rd_r=0VC6V2KNET2SN99AHTN1amp;amp;pf_rd_s=center-6amp;amp;pf_rd_t=15051amp;amp;pf_rd_i=genreamp;amp;ref_=ft_gnr_mvpop_1"> Action </a> </div>
>>> t.a
<a href="/search/title?genres=actionamp;amp;title_type=featureamp;amp;explore=genresamp;amp;pf_rd_m=A2FGELUUNOQJNLamp;amp;pf_rd_p=facfbd0c-6f3d-4c05-9348-22eebd58852eamp;amp;pf_rd_r=0VC6V2KNET2SN99AHTN1amp;amp;pf_rd_s=center-6amp;amp;pf_rd_t=15051amp;amp;pf_rd_i=genreamp;amp;ref_=ft_gnr_mvpop_1"> Action </a>

>>> t.a.get("href")
'/search/title?genres=actionamp;title_type=featureamp;explore=genresamp;pf_rd_m=A2FGELUUNOQJNLamp;pf_rd_p=facfbd0c-6f3d-4c05-9348-22eebd58852eamp;pf_rd_r=0VC6V2KNET2SN99AHTN1amp;pf_rd_s=center-6amp;pf_rd_t=15051amp;pf_rd_i=genreamp;ref_=ft_gnr_mvpop_1'
>>> 
 

просто измените each.get('href') на each.a.get('href') , и это должно решить проблему…

Для другой проблемы, о которой вы упомянули, это просто, просто измените порядок, сначала выполните проверку

 for each in html2.findAll('div',class_= 'table-cell primary'):
    genre = each.find('a').text.strip() #so you don't do the same twice
    if genre == 'Western':
        break
    dict_movies_by_genre[genre] = each.a.get('href')
print(dict_movies_by_genre)
 

Комментарии:

1. ммм, да, я получаю ссылки сейчас, но как вместо этого получить список фильмов внутри ссылки?

2. вам нужно перейти по этой ссылке и извлечь их, точно так же, как вы делаете для жанров, и я рекомендую поместить это в функцию…

3. Хорошо. Тогда я попробую. И для моей последней проблемы, поскольку я не хочу получать следующие ключи от «Western», есть идеи о том, как это исправить? Я думал, что это будет решено, как только я поставлю условие if, но, похоже, не работает

4. просто измените порядок, сначала выполните проверку