Записки из пустого тега класса (HTML) - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу снять режиссеров и актеров с IMDB с одной веб-страницы, где перечислены 50 лучших фильмов 2018 года. У меня есть проблема: я понятия не имею, как их снять, поскольку у класса нет названия.

'''part of my code which is working fine'''
response = requests.get('https://www.imdb.com/search/title?release_date=2018&sort=num_votes,desc&page=1')

for i in soup.find_all('div', class_ = 'lister-item-content'):
    film_lenght = film_details.find('span', class_='runtime').text
    film_genre = film_details.find('span', class_='genre').text
    public_rating = i.find('div', class_='ratings-bar').strong.text

'''part of the HTML code that I don't know how to work with'''
</p>, <p class="">
    Directors:
<a href="/name/nm0751577/">Anthony Russo</a>, 
<a href="/name/nm0751648/">Joe Russo</a>
<span class="ghost">|</span> 
    Stars:
<a href="/name/nm0000375/">Robert Downey Jr.</a>, 
<a href="/name/nm1165110/">Chris Hemsworth</a>, 
<a href="/name/nm0749263/">Mark Ruffalo</a>, 
<a href="/name/nm0262635/">Chris Evans</a>
</p>]

Я хочу иметь возможность снимать всех режиссеров и всех перечисленных актеров для каждого фильма. Я хочу сделать это с одного URL, как указано в коде

Ответы [ 2 ]

1 голос
/ 01 мая 2019

QHarr ответил великолепно, но позже я заметил, что в некоторых фильмах вообще нет режиссеров. в таких случаях код игнорировал эти фильмы. Поэтому я обновил код QHarr и теперь он учитывает такой сценарий:

'' '

for item in soup.select('p:contains("Stars:")'):
    reqs += 1
    if item not in soup.select('p:contains("Director:"), p:contains("Directors:")'):
        actors = [d.text for d in item.select('a:not(span ~ a)')]
        directors = ['none']
    else:
        directors = str([d.text for d in item.select('a:not(span ~ a)')]).strip('[]').replace("'","")
        actors = [d.text for d in item.select('span ~ a')]

'' '

1 голос
/ 30 апреля 2019

Вы можете использовать :contains и указать Director: или Directors:, чтобы нацелить блоки для каждого фильма; затем разделите директора, захватив теги a перед тегом span (отфильтровав их после). Актерами будут общие братья и сестры тега a тега span. Требуется BS4 v 4.7.1

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.imdb.com/search/title?release_date=2018&sort=num_votes,desc&page=1')
soup = bs(r.content, 'lxml')
for item in soup.select('p:contains("Director:"), p:contains("Directors:")'):
    #print(item)
    directors = [d.text for d in item.select('a:not(span ~ a)')]
    actors = [d.text for d in item.select('span ~ a')]
    print(directors, actors)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...