Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 30, 2013 00:07:48

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Помогите пожалуйста, не могу разобраться как мне распарсить страницу http://www.kinopoisk.ru/film/19287/.
Нужно вытащить из таблицы некоторые значения. На пример, получить год выхода фильма, его жанр и т д.
Проблема в том, что количество информации для каждого фильма разное и я по этому не знаю как вытащить нужные мне данные.


Отредактировано duekf6o+p62izk (Дек. 30, 2013 00:09:26)

Офлайн

#2 Дек. 30, 2013 10:00:21

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Можете задать искомый параметр, найти его в class=“type” и соответствующий ему href.text. профит.)

Офлайн

#3 Дек. 30, 2013 10:43:42

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Не совсем понял, что ты предлагаешь. опиши подробней пожалуйста.

Просто если все правильно понял, то значит ты не совсем понял о чем я говорю, не все так просто.

Отредактировано duekf6o+p62izk (Дек. 30, 2013 10:57:40)

Офлайн

#4 Дек. 30, 2013 11:02:34

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Вообщем так как я написал выше у меня у самого не получилось (тороплюсь, некогда разбираться), и я сделал по тупому:

# -*- coding: UTF-8 -*-
from grab import Grab
num=0
usl=[u"год",u"страна",u"жанр"]
g=Grab()
g.go("http://www.kinopoisk.ru/film/19287/")
dart=g.doc.select("body").text().split(" ")
for sel in list(dart):
    if num==1:
            print sel
            num=0
    for loop in list(usl):
        if sel==loop:
            usl.remove(loop)
            num+=1
Заданные условия выдал)

Офлайн

#5 Дек. 30, 2013 11:06:01

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Твой код частично работает. Возвращает только год и страну, а жанр не возвращает.
Кстати, если взять ссылку на фильм который снимался в нескольких странах то выплывет ещё одна проблема, что выводится только 1 страна.

Отредактировано duekf6o+p62izk (Дек. 30, 2013 11:15:28)

Офлайн

#6 Дек. 30, 2013 11:10:25

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

У меня просто была проблема сначала, что css селектор нужный разный использовать для доступа к каждому элементу, я её решил, и потом встретился с проблемой, что пунктов в таблице всегда разное количество и по этому мой код иногда выдаёт ошибки.

Офлайн

#7 Дек. 30, 2013 11:24:04

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Странно у меня жанр выводит… Вы кстати можете выложить свой код чтобы более опытные форумчане могли чтолибо подсказать

Офлайн

#8 Дек. 30, 2013 13:16:06

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Вот отрывок из моего кода, в котором как раз проблема.
Проблема в том, что количество информации по каждому фильму разное и как следствие css селекторы не всегда ссылаются в нужное место таблицы и из-за этого проблемы.
Помогите разработать более универсальный способ парсинга страницы кинопоиска.

import lxml.html
import requests
film_info = {}
headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0'}
page = requests.get('http://www.kinopoisk.ru/level/1/film/40775/sr/1/', headers=headers)
doc = lxml.html.document_fromstring(page.text)
data = {'год': '.info tr:nth-child(1) td a', 'страна': '.info tr:nth-child(2) td a',
        'жанр': '.info tr:nth-child(11) td a', 'время': 'td#runtime',
        'описание': 'table tr:nth-child(1) span div.brand_words',
        'название': 'div#headerFilm h1.moviename-big', 'оригинальное название': 'div#headerFilm span'}
for key in data.keys():
    for element in doc.cssselect(data[key]):
        if key != 'описание':
            try:
                film_info[key] = film_info.setdefault(key, '') + element.text + ', '
            except TypeError:
                film_info[key] = film_info.setdefault(key, '') + '' + ', '
        else:
            film_info[key] = element.text_content()
    film_info[key] = film_info[key].rstrip(', ')

Офлайн

#9 Дек. 31, 2013 08:32:26

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Прошу:

# -*- coding: UTF-8 -*-
from grab import Grab
num=0
nu=0
usl=[u"год",u"страна",u"жанр"]
g=Grab()
g.go("http://www.kinopoisk.ru/film/319/")
print g.doc.select("//title").text()
for ser in g.doc.select("//td"):
       if nu==1:
           print ser.text()
           nu=0
       for loop in list(usl):
            if ser.text()==loop:
                usl.remove(loop)
                nu+=1
У меня работает стопроцентно, тестировал на разнообразных фильмах.

Отредактировано noob_saibot (Дек. 31, 2013 08:42:03)

Офлайн

#10 Дек. 31, 2013 10:18:18

duekf6o+p62izk
Зарегистрирован: 2013-12-30
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг сайта с lxml

Да работает, спасибо)
А я вот свой велосипед допилил и теперь я решил свою проблему)

Отредактировано duekf6o+p62izk (Дек. 31, 2013 10:43:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version