Latest posts on Товарищи, помогите!! topichttp://python.su/forum/topic/35263/2018-05-25T08:59:02+03:00Общий :: Центр помощи :: Товарищи, помогите!!
2018-05-25T08:59:02+03:00ZerG192353Цена вопроса?
Общий :: Центр помощи :: Товарищи, помогите!!
2018-05-16T15:44:14+03:00reseweres192220Здравствуйте!<br/>В курсе обучения появилась дисциплина основ языков программирования, а я все больше понимаю что я не программист, но лабораторные зкарыть все-таки нужно…сам уткнулся в экран не понимаю что делать, прошу помощи! Спасибо Вам!<br/><br/>II вариант<br/>1. Используя модуль urllib получить название и цены принтеров с сайта <a href="http://price.ru/office/printer/office-printer/">http://price.ru/office/printer/office-printer/</a><br/>2. Записать результаты в файл в формате: название, цена с сайта.<br/> Московский технологический институт<br/>Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин<br/>3. Создать класс Data_repository, в котором определить атрибут-данных (словарь данных, полученных с сайта) и 2 метода: parse_site() и save_to_file(), которые реализуют 2 предыдущих задания.<br/>4. Найти одинаковые товары с данными из задания к лабораторной работе 2. Записать в файл сравнение цен с данными, полученными с сайта.<br/><br/>Порядок выполнения работы<br/>1. Для того чтобы решить поставленную задачу, необходимо изучить исходный код страницы, которую мы получаем. Вот фрагмент, который содержит данные одного монитора.<br/> <br/><divstyle=“float:left;margin:0;font-size:16px;top:- 5px;position:relative;”><br/><a href=“/model/monitor-lcd/samsung-e1920nr”>Samsung E1920NR</a> </div><br/> <div style=“margin-top:30px;”><br/> <div style=“margin-bottom:7px;”><br/><span>Средняяцена: <span style=“color:#CC0000”>5010 р.</span></span> </div><br/><div><br/>Диагональ 19“, 1280 x 1024, матрица TN, вес 4.2 кг, VGA </div><br/><div style=”margin-top:7px;“><br/><a href=”/model-offers/?tm=246&pricing=1&cat=0209“>Предложения: 304</a> </div><br/></div><br/> <br/> <br/>В коде хорошо видно, что нужные нам строки имеют одни и те же особенности.<br/>Строка с названием идет после строки: <div style=”float:left;margin:0;font- size:16px;top:-5px;position:relative;“><br/>Строка со средней ценой начинается со строки: <span>Средняя цена: <spanstyle=”color:#CC0000“><br/>Это значит, что необходимо искать эти строки и после этого разбирать уже данные строки с использованием методов работы со строкой.<br/>Код будет примерно такой:<br/># Задаем шаблон, по которому будем искать строку с названием<br/>name_template = ‘<div style=”float:left;margin:0;font-size:16px;top:- 5px;position:relative;“>’<br/># Задаем шаблон, по которому будем искать строку с ценой price_template = ‘<span>Средняя цена: <span style=”color:#CC0000">’ #Тут будет начало вашего цикла, а в теле цикла следующий код:<br/> Московский технологический институт<br/>Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин<br/> #**************************************************<br/># Флаг, указывающий, что в следующей строке будет название. flag_next_is_name = False<br/># Если в строке есть наш шаблон названия<br/>if name_template in line:<br/>flag_next_is_name = True # В следующей строке будет название elif flag_next_is_name:<br/># если в строке название, то печатаем строку (или обрабатываем) print(line)<br/># здесь желательно запустит функцию парсинга названия из строки line flag_next_is_name = False<br/># В следующей строке уже не будет названия<br/>elif price_template in line:<br/># если в строке есть наш шаблон цены, то печатаем строку<br/>print(line)<br/># здесь желательно запустит функцию парсинга цены из строки line<br/> 2. Рекомендуется продумать логику сохранения данных в массив (или словарь), а затем в файл.<br/>Логику получения данных с сайта можно вынести в отдельный модуль и класс (файл Pricegrab.py). Отметим, что данный модуль позволяет получать данные с сайта с заданной кодировкой. При этом метод get_names позволяет получить только те строки, которыеначинаютсясострокиstart_templ изаканчиваетсястрокойend_templ.<br/> # -*- coding: utf-8 -*-<br/>from urllib.request import urlopen class Price_Grabber:<br/>clean_lines = <br/>names = <br/>def __init__(self, templ):<br/>self.name_templ = templ<br/>def grab_site(self, site_URL, encoding):<br/> try:<br/> for line in urlopen(site_URL):<br/> line = str(line,encoding)<br/> <br/> Московский технологический институт<br/>Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин<br/> if self.name_templ in line:<br/> self.clean_lines.append(line)<br/>except: print('Сайт не доступен') def get_names(self, start_templ, end_templ):<br/> len(start_templ)<br/>for line in self.clean_lines:<br/>if (line.find(start_templ)<0): return start_index=line.find(start_templ) +<br/> end_index = line.find(end_templ)<br/> self.names.append(line) def clean_names(self, template_to_replace, new_value):<br/> results = <br/> for line in self.names:<br/>results.append(line.replace(template_to_replace,new_value)) return results<br/>def clean_arrays(self): self.clean_lines = <br/> self.names = <br/> Для нашего примера с мониторами данный модуль не подходит (поскольку мы находим строки следующие за ключевыми), но можно создать новый класс, наследующий класс Price_Grabber, и переопределить методы класса с учетом другого способа парсинга.<br/>3. Проиллюстрируем использование класса Price_Grabber на примере получения<br/>данных о ноутбуках с сайта abc.ru. Основной модуль программы может быть выполнен следующим образом (файл dz_3.py).<br/> # -*- coding: utf-8 -*-<br/>from pricegrab import Price_Grabber def main():<br/>pg = Price_Grabber('<font class=“font_4”><a') pg.grab_site('<a href="http://nb.abc.ru/nb.htm">http://nb.abc.ru/nb.htm</a>', ‘cp1251’) pg.get_names('.htm">','</b>')<br/> <br/> Московский технологический институт<br/>Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин<br/> <br/>names = pg.clean_names('<b>','') n = len(names)<br/>for i in range(n):<br/> print(names<em>,', ')<br/>if __name__ == “__main__”: main()<br/>4. В данном примере извлекается информация с сайта и обрабатываются подстроки, содержащие названия, которые затем очищаются от ненужных html-тегов и выводятся на экран.<br/>5. Создать класс Data_repository, в котором определить атрибут-данных (массив данных, полученных с сайта) и 2 метода: parse_site() и save_to_file(), которые реализуют получение данных с сайта и запись результата в файл.<br/>Следует отметить, что подобная абстракция позволит оставлять основной код<br/>программы без изменений, не зависимо от кода парсинга сайта и кода записи в файл.<br/></em>