Уведомления

Группа в Telegram: @pythonsu

#1 Июль 5, 2015 15:19:15

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

День добрый.

Хочу запарсить сайт с расписанием сеансов кинотеатров.
В конце кода есть условие 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)

Офлайн

#2 Июль 5, 2015 15:53:00

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

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 Июль 5, 2015 16:06:08

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

Хороший вариант) я все в лоб пытался решить…
Ваш код решил проблему с условием, а вот проблема с 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)

Офлайн

#4 Июль 5, 2015 17:02:40

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

Точно, вот так будет правильно. Поправил :

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)

Офлайн

#5 Июль 5, 2015 17:46:07

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

А вообще как бы у этого сайта есть API.

Офлайн

#6 Июль 5, 2015 18:30:03

TitanFighter
Зарегистрирован: 2015-06-23
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml/xpath - проверить наличие элемента xpath и правильно создать условие

Спасибо) Я решил напрямую попарсить, так как сам навык парсинга в жизни пригодится. Уже не раз сталкивался в жизни, когда нужно стянуть откуда то инфу и приходилось делать это руками. + познакомился с Xpath. Раньше на него смотрел квадратными глазами, но пару дней посидев в гугле понял, что очень зачетная вещь.

Отредактировано TitanFighter (Июль 5, 2015 18:35:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version