Уведомления

Группа в Telegram: присоединиться

#1 Май 16, 2018 15:44:14

reseweres
Зарегистрирован: 2018-05-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Товарищи, помогите!!

Здравствуйте!
В курсе обучения появилась дисциплина основ языков программирования, а я все больше понимаю что я не программист, но лабораторные зкарыть все-таки нужно…сам уткнулся в экран не понимаю что делать, прошу помощи! Спасибо Вам!

II вариант
1. Используя модуль urllib получить название и цены принтеров с сайта http://price.ru/office/printer/office-printer/
2. Записать результаты в файл в формате: название, цена с сайта.
Московский технологический институт
Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин
3. Создать класс Data_repository, в котором определить атрибут-данных (словарь данных, полученных с сайта) и 2 метода: parse_site() и save_to_file(), которые реализуют 2 предыдущих задания.
4. Найти одинаковые товары с данными из задания к лабораторной работе 2. Записать в файл сравнение цен с данными, полученными с сайта.

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

<divstyle=“float:left;margin:0;font-size:16px;top:- 5px;position:relative;”>
<a href=“/model/monitor-lcd/samsung-e1920nr”>Samsung E1920NR</a> </div>
<div style=“margin-top:30px;”>
<div style=“margin-bottom:7px;”>
<span>Средняяцена: <span style=“color:#CC0000”>5010 р.</span></span> </div>
<div>
Диагональ 19“, 1280 x 1024, матрица TN, вес 4.2 кг, VGA </div>
<div style=”margin-top:7px;“>
<a href=”/model-offers/?tm=246&pricing=1&cat=0209“>Предложения: 304</a> </div>
</div>


В коде хорошо видно, что нужные нам строки имеют одни и те же особенности.
Строка с названием идет после строки: <div style=”float:left;margin:0;font- size:16px;top:-5px;position:relative;“>
Строка со средней ценой начинается со строки: <span>Средняя цена: <spanstyle=”color:#CC0000“>
Это значит, что необходимо искать эти строки и после этого разбирать уже данные строки с использованием методов работы со строкой.
Код будет примерно такой:
# Задаем шаблон, по которому будем искать строку с названием
name_template = ‘<div style=”float:left;margin:0;font-size:16px;top:- 5px;position:relative;“>’
# Задаем шаблон, по которому будем искать строку с ценой price_template = ‘<span>Средняя цена: <span style=”color:#CC0000">’ #Тут будет начало вашего цикла, а в теле цикла следующий код:
Московский технологический институт
Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин
#**************************************************
# Флаг, указывающий, что в следующей строке будет название. flag_next_is_name = False
# Если в строке есть наш шаблон названия
if name_template in line:
flag_next_is_name = True # В следующей строке будет название elif flag_next_is_name:
# если в строке название, то печатаем строку (или обрабатываем) print(line)
# здесь желательно запустит функцию парсинга названия из строки line flag_next_is_name = False
# В следующей строке уже не будет названия
elif price_template in line:
# если в строке есть наш шаблон цены, то печатаем строку
print(line)
# здесь желательно запустит функцию парсинга цены из строки line
2. Рекомендуется продумать логику сохранения данных в массив (или словарь), а затем в файл.
Логику получения данных с сайта можно вынести в отдельный модуль и класс (файл Pricegrab.py). Отметим, что данный модуль позволяет получать данные с сайта с заданной кодировкой. При этом метод get_names позволяет получить только те строки, которыеначинаютсясострокиstart_templ изаканчиваетсястрокойend_templ.
# -*- coding: utf-8 -*-
from urllib.request import urlopen class Price_Grabber:
clean_lines =
names =
def __init__(self, templ):
self.name_templ = templ
def grab_site(self, site_URL, encoding):
try:
for line in urlopen(site_URL):
line = str(line,encoding)

Московский технологический институт
Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин
if self.name_templ in line:
self.clean_lines.append(line)
except: print('Сайт не доступен') def get_names(self, start_templ, end_templ):
len(start_templ)
for line in self.clean_lines:
if (line.find(start_templ)<0): return start_index=line.find(start_templ) +
end_index = line.find(end_templ)
self.names.append(line) def clean_names(self, template_to_replace, new_value):
results =
for line in self.names:
results.append(line.replace(template_to_replace,new_value)) return results
def clean_arrays(self): self.clean_lines =
self.names =
Для нашего примера с мониторами данный модуль не подходит (поскольку мы находим строки следующие за ключевыми), но можно создать новый класс, наследующий класс Price_Grabber, и переопределить методы класса с учетом другого способа парсинга.
3. Проиллюстрируем использование класса Price_Grabber на примере получения
данных о ноутбуках с сайта abc.ru. Основной модуль программы может быть выполнен следующим образом (файл dz_3.py).
# -*- coding: utf-8 -*-
from pricegrab import Price_Grabber def main():
pg = Price_Grabber('<font class=“font_4”><a') pg.grab_site('http://nb.abc.ru/nb.htm', ‘cp1251’) pg.get_names('.htm">','</b>')

Московский технологический институт
Платформы разработки и прикладные языки программирования Лабораторный практикум, М.Г. Ляпин

names = pg.clean_names('<b>','') n = len(names)
for i in range(n):
print(names,', ')
if __name__ == “__main__”: main()
4. В данном примере извлекается информация с сайта и обрабатываются подстроки, содержащие названия, которые затем очищаются от ненужных html-тегов и выводятся на экран.
5. Создать класс Data_repository, в котором определить атрибут-данных (массив данных, полученных с сайта) и 2 метода: parse_site() и save_to_file(), которые реализуют получение данных с сайта и запись результата в файл.
Следует отметить, что подобная абстракция позволит оставлять основной код
программы без изменений, не зависимо от кода парсинга сайта и кода записи в файл.

Офлайн

#2 Май 25, 2018 08:59:02

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 1447
Репутация: +  42  -
Профиль   Отправить e-mail  

Товарищи, помогите!!

Цена вопроса?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version