Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций? [RSS Feed]

#1 Июнь 23, 2015 16:34:51

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

Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?

Добрый день.

Только учу Питон и в качестве первого проекта решил запарсить другой сайт.

По ходу кодинга возникло у меня 2 вопроса:
1. Как подключить одну функцию к другой (чтоб результат первой функции передался во вторую)?
2. Как правильно вывести общий результат работы этих двух функций?

До комментария
#!!!!—–>
код работает. Не могу правильно состыковать то, что идет ниже этого самого комментария.

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 cinemas_info(url): 
        def basic_cinemas_info(url): 
        '''Получаем Город, Название и Детальную_ссылку'''
            prepare(url)
            tree = prepare(url)
            for city in tree.xpath(".//div[@class='city-caption']"):
                for cinema in city.xpath("following-sibling::*[1]/li/a"):
                    city1 = city.xpath("text()")[0]
                    name1 = cinema.xpath("text()")[0]
                    detailed_url = cinema.xpath("@href")[0]
                    return city1, name1, detailed_url
    #!!!!-----> Не могу правильно подцепить нижнюю часть кода к верхней <------!!!!!
        def detailed_cinemas_info():
        '''из basic_cinemas_info нужно получить "detailed_url" для дополучения нужной информации (Улицы, Телефона, Сайта)'''
            detailed_url = basic_cinemas_info(url)[2]
            #ВОПРОС: Как правильно получить detailed_url из def basic_cinemas_info(url)?
            prepare(detailed_url)
            tree = prepare(url)
            for street in tree.xpath(".//div[@class='address']"):
                street1 = street.xpath("text()")[0]
                for phone in tree.xpath(".//div[@class='phone']"):
                    phone1 = phone.xpath("text()")[0]
                    for website in tree.xpath(".//div[@class='website']/a"):
                        website1 = website.xpath("@href")[0]
                        return street1, phone1, website1
        print (city1,name1,street1,phone1,website1)
        '''итог работы двух функций объединяем и выводим'''
        #ВОПРОС: Как правильно вывести объединенный результат функций basic_cinemas_info и detailed_cinemas_info?
    cinemas_info('http://vkino.com.ua/cinema/#!=')

Принцип парсинга “один-к многим”, т.е. на одной странице есть список всех кинотеатров с базовой инфой и дальше обращаемся к детальной странице каждого кинотеатра для получения доп инфы. Результат работы двух функций объединяем и выводим.

П.С. Может есть какой то метод и так будет правильней, вставить функцию detailed_cinemas_info прямо в цикл функции basic_cinemas_info?
Спасибо.

Отредактировано TitanFighter (Июнь 23, 2015 16:36:42)

Офлайн

#2 Июнь 23, 2015 16:51:51

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

Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?

Алгоритм :

1. Получаете ссылки на все кинотеатры и складываете их куда-нибудь ( например в список или даже лучше в словарь где ключом будет название кинотеатра )
2. Итерируете полученный результат.

Как пример :

def get_cinemas(url):
     data = []
     for cinema in cinemas:
          data.append([city1, name1, detailed_url])
     return data
for cinema in get_cinemas(url):
     # тут запускаем функцию которая парсит отдельный кинотеатр, ссылка на кинотеатр тут будет cinema[2] 

Офлайн

#3 Июнь 23, 2015 17:29:43

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

Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?

Спасибо большое за внимание к моему вопросу.
С первой частью все просто - засунуть в список

Со второй частью

for cinema in get_cinemas(url):
     # тут запускаем функцию которая парсит отдельный кинотеатр, ссылка на кинотеатр тут будет cinema[2]
не получается.

Я сделал вот так:
for cinema in get_cinemas(url):
	detailed_url = cinema[2] #Понимаю, что гдето тут напутал, но не могу сообразить, как правильно
	prepare(detailed_url)
	tree = prepare(url)
	for street in tree.xpath(".//div[@class='address']"):
		street1 = street.xpath("text()")[0]
		for phone in tree.xpath(".//div[@class='phone']"):
			phone1 = phone.xpath("text()")[0]
			for website in tree.xpath(".//div[@class='website']/a"):
				website1 = website.xpath("@href")[0]
				print (street1, phone1, website1)
и получаю
Traceback (most recent call last):
  File "<pyshell#65>", line 1, in <module>
    for cinema in get_cinemas(url):
NameError: name 'url' is not defined
Где туплю? (прошу прощения, на лекарствах сижу - мозг = овощь

Отредактировано TitanFighter (Июнь 23, 2015 17:39:24)

Офлайн

#4 Июнь 24, 2015 00:39:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?

Сначала нужно записать алгоритм от начала до конца.
Потом по этому алгоритму построить блок-схему.
Потом по этой блок-схеме написать псевдокод.
Потом по этому псевдокоду написать код.

Если же начинаешь в обратном порядке, то будешь сто раз переписывать, а потом всё равно получится неправильно.



Офлайн

#5 Июнь 24, 2015 09:27:10

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

Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?

TitanFighter
Спасибо большое за внимание к моему вопросу.С первой частью все просто - засунуть в список Со второй частью

Окей, как сказал py.user.next давай составим алгоритм и разберёмся в нём от и до.

1. Для начала нужно определиться с тем как мы будем хранить информацию о кинотеатрах. Я предлагаю словарь вида : {Город : {Название кинотеатра: {адрес, веб-сайт, телефон}}}. Это удобно и практично.

2. Нам нужна функция которая достанет базовую информацию о кинотеатрах ( город, название и ссылку на кинотеатр внутри каталога ). Эта функция у тебя есть, я её немного подправил :

from lxml import etree
import requests
URL = 'http://vkino.com.ua/cinema/#!='
BASE_URL = 'http://vkino.com.ua'
def get_basic_cinemas_info():
    html = requests.get(URL).text
    tree = etree.HTML(html)
    data = {}
    for city in tree.xpath(".//div[@class='city-caption']"):
        data[city.text.lstrip()] = {}
        for cinema in city.xpath("following-sibling::*[1]/li/a"):
                    name1 = cinema.xpath("text()")[0]
                    detailed_url = cinema.xpath("@href")[0]
                    data[city.text.lstrip()][name1] = dict(url=detailed_url)
    return data

Функция должна вернуть нам словарь, который я описал в первом пункте. Проверим :

>>> from vkino_parser import *
>>> get_basic_cinemas_info()
{'Николаев': {'Мультиплекс ТРЦ «Сити Центр»': {'url': '/cinema/mx-nik-citycentr'}, 'Пионер': {'url': '/cinema/pioner'}}, 'Луцк': {'PREMIER CITY': {'url': '/cinema/premiercity'}}, ... }

Половина работы сделана !

3. Теперь тебе нужно расширить полученный словарь дополнительной информацией о каждом кинотеатре. Вот функция которая это сделает :

def extend_cinemas_info(cinemas_dict):
    for city in cinemas_dict:
        for cinema in cinemas_dict[city]:
            html = requests.get(BASE_URL+cinemas_dict[city][cinema]['url']).text
            tree = etree.HTML(html)
            for street in tree.xpath(".//div[@class='address']"):
                street1 = street.xpath("text()")[0]
                for phone in tree.xpath(".//div[@class='phone']"):
                    phone1 = phone.xpath("text()")[0]
                    for website in tree.xpath(".//div[@class='website']/a"):
                        website1 = website.xpath("@href")[0]
                        cinemas_dict[city][cinema] = dict(adress=street1.lstrip().rstrip(),
                                                          phone_number=phone1.lstrip().rstrip().replace('Телефон:', ''),
                                                          web=website1.lstrip().rstrip())
    return cinemas_dict

Функция принимает словарь, расширяет его нужными данными и возвращает нам обратно.

4. Соберём все воедино :

if __name__ == '__main__':
    cinemas = get_basic_cinemas_info()  # получили словарь из пункта 2
    extended_info = extend_cinemas_info(cinemas)  # и расширили его. теперь в объекте extended_info вся нужная нам информация

Отредактировано ayb (Июнь 24, 2015 09:36:37)

Офлайн

  • Начало
  • » Python для новичков
  • » Как вызвать одну функцию за другой передав из 1ой во 2ю значение и вывести объединенный результат работы обеих функций?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version