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


noob_saibot
Можете задать искомый параметр, найти его в class=“type” и соответствующий ему href.text. профит.)
duekf6o+p62izk
Не совсем понял, что ты предлагаешь. опиши подробней пожалуйста.

Просто если все правильно понял, то значит ты не совсем понял о чем я говорю, не все так просто.
noob_saibot
Вообщем так как я написал выше у меня у самого не получилось (тороплюсь, некогда разбираться), и я сделал по тупому:
# -*- 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
Заданные условия выдал)
duekf6o+p62izk
Твой код частично работает. Возвращает только год и страну, а жанр не возвращает.
Кстати, если взять ссылку на фильм который снимался в нескольких странах то выплывет ещё одна проблема, что выводится только 1 страна.
duekf6o+p62izk
У меня просто была проблема сначала, что css селектор нужный разный использовать для доступа к каждому элементу, я её решил, и потом встретился с проблемой, что пунктов в таблице всегда разное количество и по этому мой код иногда выдаёт ошибки.
noob_saibot
Странно у меня жанр выводит… Вы кстати можете выложить свой код чтобы более опытные форумчане могли чтолибо подсказать
duekf6o+p62izk
Вот отрывок из моего кода, в котором как раз проблема.
Проблема в том, что количество информации по каждому фильму разное и как следствие 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(', ')
noob_saibot
Прошу:
# -*- 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
У меня работает стопроцентно, тестировал на разнообразных фильмах.
duekf6o+p62izk
Да работает, спасибо)
А я вот свой велосипед допилил и теперь я решил свою проблему)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB