Форум сайта python.su
День добрый.
Хочу запарсить сайт с расписанием сеансов кинотеатров.
В конце кода есть условие if (отмечено комментарием), которое на данный момент всем сеансам присваивает 3Д.
Помогите пожалуйста решить 2 проблемы:
1) исправить код, чтоб он правильно проверял наличие <span class=“show-format”>3D</span> на этой странице (вполне возможно, что этот пунк я написал правильно, а проблема только во втором пункте)
2) чтоб 3Д присваивалось только тому сеансу, который реально идет в 3Д, а не всем в подряд сеансам (я видимо или не правильно условие if написал или\и не правильно его разместил в цикле)
import requests from lxml.html import fromstring def prepare(url): url = requests.get(url) tree = fromstring(url.text) tree.make_links_absolute(url.url) return tree def detailed_cinemas_films(url): showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F' tree = prepare(url + showtimes_tab_url) for film in tree.xpath('//div[@class="content"]'): film_name = film.xpath('.//a[@class="navi"]/text()')[0] for dates in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'): film_dates = dates.xpath('.//div[@class="date"]/text()')[0] for times in dates.xpath('.//ul[@class="showtimes-day-block"]/li/a'): film_times = times.xpath('text()')[0] # Проблема: всем сеансам присваивает 3Д if dates.find('.//span[@class="show-format"]') is None: pass else: is3D = dates.xpath('.//span[@class="show-format"]/text()') print(film_name, film_dates, film_times, is3D) detailed_cinemas_films('http://vkino.com.ua/cinema/kinoodessa-kinostancia')
Терминатор: Генезис 5 июля, сегодня 21:00
Терминатор: Генезис 5 июля, сегодня 21:50
Терминатор: Генезис 6 июля, понедельник 10:10
Отредактировано TitanFighter (Июль 5, 2015 15:21:06)
Офлайн
import requests from lxml.html import fromstring def prepare(url): url = requests.get(url) tree = fromstring(url.text) tree.make_links_absolute(url.url) return tree def detailed_cinemas_films(url): showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F' tree = prepare(url + showtimes_tab_url) for film in tree.xpath('//div[@class="content"]'): film_name = film.xpath('.//a[@class="navi"]/text()')[0] for dates in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'): film_dates = dates.xpath('.//div[@class="date"]/text()')[0] for times in dates.xpath('.//ul[@class="showtimes-day-block"]/li/a'): film_times = times.xpath('text()')[0] # Проблема: всем сеансам присваивает 3Д is_3d = dates.find('.//span[@class="show-format"]') if is_3d is not None: print(film_dates, film_name, film_times, '3D') else: print(film_dates, film_name, film_times) detailed_cinemas_films('http://vkino.com.ua/cinema/kinoodessa-kinostancia')
5 июля, сегодня Терминатор: Генезис 16:10 3D
5 июля, сегодня Терминатор: Генезис 17:00 3D
5 июля, сегодня Терминатор: Генезис 18:00 3D
5 июля, сегодня Терминатор: Генезис 18:40 3D
5 июля, сегодня Терминатор: Генезис 19:25 3D
5 июля, сегодня Терминатор: Генезис 20:25 3D
5 июля, сегодня Терминатор: Генезис 21:00 3D
5 июля, сегодня Терминатор: Генезис 21:50 3D
6 июля, понедельник Терминатор: Генезис 10:10 3D
6 июля, понедельник Терминатор: Генезис 11:25 3D
6 июля, понедельник Терминатор: Генезис 12:40 3D
6 июля, понедельник Терминатор: Генезис 13:50 3D
6 июля, понедельник Терминатор: Генезис 15:20 3D
6 июля, понедельник Терминатор: Генезис 16:10 3D
6 июля, понедельник Терминатор: Генезис 17:00 3D
6 июля, понедельник Терминатор: Генезис 18:00 3D
6 июля, понедельник Терминатор: Генезис 18:40 3D
6 июля, понедельник Терминатор: Генезис 19:25 3D
6 июля, понедельник Терминатор: Генезис 20:25 3D
6 июля, понедельник Терминатор: Генезис 21:00 3D
6 июля, понедельник Терминатор: Генезис 21:50 3D
5 июля, сегодня Супер Майк XXL 22:50
6 июля, понедельник Супер Майк XXL 15:00
6 июля, понедельник Супер Майк XXL 22:50
5 июля, сегодня Третий лишний 2 17:00
5 июля, сегодня Третий лишний 2 19:10
6 июля, понедельник Третий лишний 2 17:00
6 июля, понедельник Третий лишний 2 19:10
6 июля, понедельник Мыслями наизнанку 10:00 3D
6 июля, понедельник Мыслями наизнанку 11:00 3D
6 июля, понедельник Мыслями наизнанку 13:00 3D
5 июля, сегодня Мир Юрского периода 21:25
6 июля, понедельник Мир Юрского периода 12:10 3D
6 июля, понедельник Мир Юрского периода 14:35 3D
6 июля, понедельник Мир Юрского периода 21:25 3D
Офлайн
Хороший вариант) я все в лоб пытался решить…
Ваш код решил проблему с условием, а вот проблема с 3Д только для тех фильмов, которые идут в 3Д осталась.
Вот к примеру по Терминатору на 5ое июля расписание с сайта:
16:10, 17:00 3D, 18:00, 18:40 3D, 19:25, 20:25, 21:00 3D, 21:50
А парсер говорит, что все сеансы в 3Д
Отредактировано TitanFighter (Июль 5, 2015 16:07:06)
Офлайн
Точно, вот так будет правильно. Поправил :
import requests from lxml.html import fromstring def prepare(url): url = requests.get(url) tree = fromstring(url.text) tree.make_links_absolute(url.url) return tree def detailed_cinemas_films(url): showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F' tree = prepare(url + showtimes_tab_url) for film in tree.xpath('//div[@class="content"]'): film_name = film.xpath('.//a[@class="navi"]/text()')[0] for dates in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'): film_dates = dates.xpath('.//div[@class="date"]/text()')[0] for times in dates.xpath('.//ul[@class="showtimes-day-block"]/li'): film_times = times.xpath('a/text()') if len(film_times) == 0: # Пропускаем уже прошедшие сеансы film_times = None is_3d = times.find('span') if film_times is not None: if is_3d is not None: print(film_dates, film_name, film_times[0], '3D') else: print(film_dates, film_name, film_times[0]) detailed_cinemas_films('http://vkino.com.ua/cinema/kinoodessa-kinostancia')
Отредактировано ayb (Июль 5, 2015 17:40:41)
Офлайн
А вообще как бы у этого сайта есть API.
Офлайн
Спасибо) Я решил напрямую попарсить, так как сам навык парсинга в жизни пригодится. Уже не раз сталкивался в жизни, когда нужно стянуть откуда то инфу и приходилось делать это руками. + познакомился с Xpath. Раньше на него смотрел квадратными глазами, но пару дней посидев в гугле понял, что очень зачетная вещь.
Отредактировано TitanFighter (Июль 5, 2015 18:35:37)
Офлайн