Я не заметил, что вы указали film.period
в коде, размещенном на Github, поэтому я не стал отлаживать ваш код без этого и решил реализовать его с нуля.
После быстрогоПоиском, я узнал, что в кинотеатре «Планета Кино» есть XML-файлы на их веб-сайте с графиком показа фильмов.Вы можете найти некоторые из них здесь .Я не уверен, почему, но там не было записи для lvov2
кинотеатра с сеансами, соответствующими ссылке из вашего вопроса.Однако мне удалось найти его, просто изменив часть URL: http://planetakino.ua/lvov2/ua/showtimes/xml/.
Код ниже должен делать именно то, что вы хотите:
import datetime
from typing import List
import dateparser
import requests
from bs4 import BeautifulSoup, Tag
Date = datetime.datetime
Screening = Tag
Screenings = List[Tag]
def get_movie_id(soup: BeautifulSoup, searched_movie: str) -> int:
movie = soup.find(
lambda elem: elem.name == 'movie' and searched_movie in elem.title.string
)
movie_id = int(movie['id'])
return movie_id
def get_movie_screenings(soup: BeautifulSoup, movie_id: int, searched_date: Date) -> Screenings:
formatted_date = searched_date.strftime('%Y-%m-%d')
screenings = soup.select(f'showtimes '
f'> day[date={formatted_date}] '
f'> show[movie-id={movie_id}]')
return screenings
def get_show_times(searched_movie: str, searched_date: Date) -> Screenings:
url = 'http://planetakino.ua/lvov2/ua/showtimes/xml/'
html = requests.get(url).text
soup = BeautifulSoup(html, 'xml')
movie_id = get_movie_id(soup, searched_movie)
screenings = get_movie_screenings(soup, movie_id, searched_date)
return screenings
date = dateparser.parse(input('Type the date: '))
if date is not None:
import pprint
pprint.pprint(get_show_times('Дедпул 2', date))
else:
print('Sorry, I cannot parse the date you gave me.')
Вывод:
Type the date: 27 червня, середа
[<show full-date="2018-06-27 19:40:00" hall-id="104" movie-id="2385" order-url="https://pay.planetakino.ua/hall/pk-lvov2/485693" technology="Cinetech+2D" theatre-id="pk-lvov2" time="19:40"/>,
<show full-date="2018-06-27 23:45:00" hall-id="101" movie-id="2385" order-url="https://pay.planetakino.ua/hall/pk-lvov2/485506" technology="4dx" theatre-id="pk-lvov2" time="23:45"/>]
Я использовал dateparser для анализа введенной даты, поэтому он работает с различными форматами, языками, например, 27th June
, 27 червня, середа
и многими другими.Это действительно здорово, и мне это нравится.
Не торопитесь, чтобы прочитать и понять код, возможно, вы захотите взглянуть на .select()
и CSS-селекторы ( дочерние комбинаторы и селекторы атрибутов ).
Примечание: вам нужно использовать Python 3.6+, так как я использовал Интерполяция буквенных строк (f-strings
) и тип подсказки (3,5 +).