Форум сайта python.su
0
Добрый день.
Только учу Питон и в качестве первого проекта решил запарсить другой сайт.
По ходу кодинга возникло у меня 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/#!=')
Отредактировано TitanFighter (Июнь 23, 2015 16:36:42)
Офлайн
24
Алгоритм :
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]
Офлайн
0
Спасибо большое за внимание к моему вопросу.
С первой частью все просто - засунуть в список 
Со второй частью
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)
Офлайн
857
Сначала нужно записать алгоритм от начала до конца.
Потом по этому алгоритму построить блок-схему.
Потом по этой блок-схеме написать псевдокод.
Потом по этому псевдокоду написать код.
Если же начинаешь в обратном порядке, то будешь сто раз переписывать, а потом всё равно получится неправильно.
Офлайн
24
TitanFighter
Спасибо большое за внимание к моему вопросу.С первой частью все просто - засунуть в список Со второй частью
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'}}, ... }
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
if __name__ == '__main__': cinemas = get_basic_cinemas_info() # получили словарь из пункта 2 extended_info = extend_cinemas_info(cinemas) # и расширили его. теперь в объекте extended_info вся нужная нам информация
Отредактировано ayb (Июнь 24, 2015 09:36:37)
Офлайн