Форум сайта python.su
0
Есть код:
count = 0 sql = '''INSERT INTO items (res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date) VALUES''' for resource_link in resources_links: try: exist_link = parser.check_exist_link(resource_link) if exist_link is not True: goose_date = parser.get_goose_date(resource_link) time_now = parser.get_time_now() if goose_date is not None: #if goose_date <= time_now: date_parsed = parser.get_converted_date(goose_date) nd_date = parser.get_nd_date(date_parsed) not_date = parser.get_not_date(date_parsed) n_date = parser.get_n_date() s_date = parser.get_s_date() log_id = parser.get_log_id() item_title = parser.get_item_title(resource_link) item_content = parser.get_item_content(resource_link) if item_title != '' and item_content != '': count+=1 sql += ''',('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')''' % ( res_id, log_id, str(resource_link), str(item_title), str(item_content), str(n_date), nd_date, s_date, not_date) sql = sql.replace('VALUES,', 'VALUES') if count == 20: huge_insert = parser.huge_insert_db(sql) sql = '' count = 0 print('Запись новостей произведена!') else: print('Нету заголовка или котента.') else: print('Гусь не нашел дату.') else: print('Новость уже есть в базе.') except Exception as e: print(f'Ошибка: {str(e)}')
Офлайн
568
r4khic
Есть такое правило хорошего кода, не помню как это правильно называется, назовем его “правило раннего выхода”. Суть в том, чтобы как можно выше к началу функции проверять условия и выходить из функции не умножая вложенность операторов.
def foo(i): if i > 0: do_something() do_something() do_something() do_something() do_something() if do_something_else(): do_something() do_something() do_something() do_something() else: print() else: print()
def foo(i): if i <= 0: print ("improper i") return do_something() do_something() do_something() do_something() do_something() if not do_something_else(): print ("improper do_something_else") return do_something() do_something() do_something() do_something()
if item_title != '' and item_content != '':
if item_title == '' or item_content == '':
Офлайн
27
r4khicДык, никто не мешает проверить состояние счётчика после завершения цикла. Если он больше 0, то пишем в БД. После завершения цикла в твоём sql будут, как раз, те самые 5, которые не попали в двадцатку.
если допустим на ресурсе появятся 25 новостей.А в БД добавятся только 20, остальные 5 не добавятся
Отредактировано Rafik (Окт. 9, 2019 18:29:58)
Офлайн
186
Зачем тебе нужно это условие? Сразу новости в базу пиши.
Офлайн
0
FishHookБлагодарю за ответ и пояснение этой темы.Для меня как новичку это очень важно.В будущем буду стараться делать код более плоским.
r4khicЕсть такое правило хорошего кода, не помню как это правильно называется, назовем его “правило раннего выхода”. Суть в том, чтобы как можно выше к началу функции проверять условия и выходить из функции не умножая вложенность операторов.
FishHookМне кажется это условие более корректней.Потому что здесь условие такое:“Если item_title не равен пустой строке и item_content тоже не равен пустой строке” выполняется блок условий.
Вместо
if item_title != ‘' and item_content != ’':
FishHookТакое: “Если item_title равен пустой строке или item_content пустой строке”.Это условие не работает в моем коде.В любом случае благодарю за то уделили мне внимание.
if item_title == ‘' or item_content == ’':
Офлайн
568
r4khic
Мне кажется это условие более корректней.Потому что здесь условие такое:“Если item_title не равен пустой строке и item_content тоже не равен пустой строке” выполняется блок условий.
А ваше условие
FishHook
if item_title == ‘' or item_content == ’':
Такое: “Если item_title равен пустой строке или item_content пустой строке”.Это условие не работает в моем коде.В любом случае благодарю за то уделили мне внимание.
if item_title != '' and item_content != '': count+=1 sql += ''',('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')''' else: print('Нету заголовка или котента.')
if item_title == '' or item_content == '': print('Нету заголовка или котента.') continue count+=1 sql += ''',('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')'''
Офлайн
0
FishHookАа теперь я понял ! Благодарю
сложность для вас не возрастает, у вас меньше возможности запутаться и совершить ошибку.
Вместо проверки условия “надо ли выполнять блок кода”, проверяйте условие “есть ли ошибка”.
Офлайн
0
Правильно ли я сделал ?
FishHook
сделайте вот так
# -*- coding: utf-8 -*- from boilerpipe_parser_component import boilerpipe_parser from pprint import pprint # < Создаем обьект класса. parser = boilerpipe_parser() # < Вызываем метод класса. resources = parser.get_resources() # < Шаблон insert запроса. sql = '''INSERT INTO items (res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)''' items_data = [] for resource in resources: # < Айди ресурса. res_id = resource[0] # < Ссылка ресурса. resource_url = resource[3] # < Ссылки на новости. resource_main_url = resource[4] link_rules = resource[5] # < Разбиваем по ',' правило выдергивание контента в массив. link_rule = link_rules.split(',') # < Переопределение переменной для того чтобы в методе 'get_resource_links' соединять ссылки. resource_domain = resource_url # < Вызов методов класса. resource_page = parser.get_html(resource_main_url) resources_links = parser.get_resource_links(resource_page, link_rule, resource_domain) print('id resource: ' + str(res_id)) print('Количество ссылок: '+str(len(resources_links))) for resource_link in resources_links: try: exist_link = parser.check_exist_link(resource_link) if exist_link is True: print('Новость уже есть в базе.') continue goose_date = parser.get_goose_date(resource_link) time_now = parser.get_time_now() if goose_date is None: print('Гусь не нашел дату.') continue if goose_date >= time_now: print('Найдена дата будущего.') continue date_parsed = parser.get_converted_date(goose_date) nd_date = parser.get_nd_date(date_parsed) not_date = parser.get_not_date(date_parsed) n_date = parser.get_n_date() s_date = parser.get_s_date() log_id = parser.get_log_id() item_title = parser.get_item_title(resource_link) item_content = parser.get_item_content(resource_link) if item_title == '' and item_content == '': print('Нету заголовка или котента.') continue items_data.append((res_id, log_id, str(resource_link), str(item_title), str(item_content), str(n_date), nd_date, s_date, not_date)) if len(items_data) == 100: huge_insert = parser.huge_insert_db(sql, items_data) sql = '' items_data = [] print('inset completed') except Exception as e: print(f'Ошибка: {str(e)}')
Офлайн
568
r4khic
Так уже лучше. Двигаемся дальше. Первое маленькое замечание
if exist_link is True:
for resource in resources: # < Айди ресурса. res_id = resource[0] # < Ссылка ресурса. resource_url = resource[3] # < Ссылки на новости. resource_main_url = resource[4] link_rules = resource[5]
def parse(): source_getter = SourceGetter() parser = Parser() data_saver = DataSaver() for site in source_getter.get_sources(): try: data = parser.parse(site) data_saver.save(data) except ParserError: print("bla bla") except SaverError: print("bla bla")
Офлайн
0
FishHookПонял,принял и изменил !
Зачем это? Не надо проверять на True и False. Выражение exist_link is True вернет True или False. Зачем нужно это выражение, если ваша переменная exist_link и так содержит True или False? масло масляное.
FishHookНе могу.Так как я принимаю эти данные кортежом из БД
r4khicТак уже лучше. Двигаемся дальше. Первое маленькое замечание
FishHookЯ понимаю,но я не могу так сделать так как все мои основные методы и они в другом модуле.
Вам надо декомпозировать вашу программу
Офлайн