Доступ к 'data-value'
, кажется, вызывает текущую проблему, так как find('span', attrs= {'name':'nv'})
должен вернуть объект BeautifulSoup
для ['data-value']
, чтобы быть успешным.Однако вместо 'data-value'
можно использовать атрибут text
вместе с getattr
.getattr
попытается получить доступ к атрибуту text
из результата find('span', attrs= {'name':'nv'})
, однако, если последний равен None
(который не имеет атрибута text
), будет возвращен сам None
, являющийсясначала указывается в качестве третьего параметра в getattr
:
from bs4 import BeautifulSoup as soup
import requests, re
from typing import NamedTuple
class Movie(NamedTuple):
title:str
rating:str
votes:str
def get_films(placeholder=None):
d = soup(requests.get('https://www.imdb.com/search/title?release_date=2014-01-01,2018-12-31&count=250&page=3&sort=moviemeter,asc&ref_=adv_nxt').text, 'html.parser')
films = [i for i in d.find_all('div', {'class':re.compile('lister-item[\w\W]+')})]
final_films = [[getattr(i.find(*c), 'text', placeholder) for c in [['a'], ['strong'], ['span', {'name':'nv'}]]] for i in films]
return [Movie(a, b, c) for a, b, c in final_films if a != ' \n']
new_films = get_films()
Первые десять элементов в new_films
:
[Movie(title='The OA', rating='7.8', votes='54,496'), Movie(title='Parmanu: The Story of Pokhran', rating='8.5', votes='4,116'), Movie(title='Batman Ninja', rating='5.7', votes='6,847'), Movie(title='Verónica', rating='6.2', votes='20,634'), Movie(title='Set It Up', rating=None, votes=None), Movie(title='Wynonna Earp', rating='7.5', votes='11,771'), Movie(title='Spectre', rating='6.8', votes='333,593'), Movie(title='Van Helsing', rating='6.0', votes='10,719'), Movie(title='The Year of Spectacular Men', rating='6.6', votes='64'), Movie(title='The Heretics', rating='4.8', votes='298')]
Обратите внимание, что для некоторых фильмов в списке рейтинг и голосаотсутствует в списке, и это решение просто предоставляет None
вместо него:
[Movie(title="Tom Clancy's Jack Ryan", rating=None, votes=None)]