Уведомления

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

#1 Июнь 12, 2019 05:20:15

irgit
Зарегистрирован: 2018-02-04
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Вот мой вариант:

Спасибо огромное!!! Ваши уроки бесценны! Хороший код python - это поэзия, черт побери! Это круто!

Офлайн

#2 Июнь 13, 2019 06:56:42

irgit
Зарегистрирован: 2018-02-04
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Добрый день уважаемые эксперты. С учётом ваших замечаний написал парсер правовой информации с использованием selenium (на сайте аякс). Оцените пожалуйста код, как его можно улучить и оптимизировать?

 from selenium import webdriver
from bs4 import BeautifulSoup as bs
import time
import re
URL = 'http://publication.pravo.gov.ru/SignatoryAuthority/region17' #ссылка на ваш регион
COUNT = 3040 #всего документов на сайте по региону
def page_parser(soup):
    '''
    извлекаем данные из страницы
    :return page_doc ->set(title, url, file, type_file, page_doc, date, id)
    '''
    PLUS_URL = 'http://publication.pravo.gov.ru{}'
    all_doc = []
    for item in soup.findAll("div", {"class": "tr"})[1:]:
        try:
            content = item.find( "div", {"class": "td vis"})
            title = content.find('a').text
            url = content.find( 'a' ).get('href')
            url = PLUS_URL.format(url)
            file = content.find('span', attrs={'class': 'notforprint'}).find('a').get('href')
            file = PLUS_URL.format(file)
            type_file = content.find( 'span', attrs={'class': 'notforprint'} ).find( 'a' ).text
            page_doc = content.find( 'span', attrs={'class': 'pagesindoccount'} ).text
            page_doc = re.findall('(\d+)', page_doc)[0]
            id = item.find( "div", {"class": "td vis notforprint"})\
                .find('span', attrs={'class': 'pagesindoccount information'}).text
            date = item.find( "div", {"class": "td vis notforprint"})\
                .findAll('span', attrs={'class': 'pagesindoccount information'})[1].text
            doc = (id, title, date, url, file, type_file, page_doc)
            all_doc.append(doc)
        except:
            z=0
    return all_doc
driver = r'D:\AnacodaProgect\geckodriver.exe' #драйвер для Firefox https://github.com/mozilla/geckodriver/releases
browser = webdriver.Firefox(executable_path=driver)
browser.get(URL)
page_count = []
OUTPUT_FILE = 'pravo_doc.csv'
with open(OUTPUT_FILE, 'w') as f:
    print('Начинаю парсить данные, ожидайте...')
    for pagination in range(1, (COUNT//30)+1):
        time.sleep(4)
        browser.find_element_by_class_name("page-nave-next").click()
        soup = bs( browser.page_source, 'lxml')
        for doc in (page_parser(soup)):
            stroka = '|'.join(doc)
            page_count.append(stroka)
            print ('Получено {} документов из {}'.format(len(page_count),COUNT))
            f.write(stroka + '\n')
f.close()
print('Описательная часть {} правовых актов региона получена'.format(len(page_count)))

Отредактировано irgit (Июнь 13, 2019 07:26:32)

Офлайн

#3 Июнь 13, 2019 09:43:07

rami
Зарегистрирован: 2018-01-08
Сообщения: 191
Репутация: +  47  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
С учётом ваших замечаний написал…
Не совсем с учётом

Два дня назад PEHDOM писал вам об обработке ошибок, но вы продолжаете except: z=0.

— Что случилось??? Это опасно???
— Не беспокойтесь, мы и не такое пережили, просто z=0

Константы PLUS_URL и OUTPUT_FILE лучше перенести к другим константам под блок импорта.

f.close() не нужно, контекстный менеджер with сам закроет файл когда нужно.

Офлайн

#4 Июнь 13, 2019 10:21:30

irgit
Зарегистрирован: 2018-02-04
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Два дня назад PEHDOM писал вам об обработке ошибок, но вы продолжаете except: z=0.
каюсь Больше не буду)

rami
f.close() не нужно, контекстный менеджер with сам закроет файл когда нужно.
буду знать

Всё понял, спасибо огромное!!!

pravo

Отредактировано irgit (Июнь 13, 2019 10:46:45)

Офлайн

#5 Июнь 13, 2019 11:02:53

irgit
Зарегистрирован: 2018-02-04
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Возник такой вопрос, когда данные открыл в pandas. В одной строке csv файла не оказалось значения ‘id’, как проверить все переменные, чтобы все строки были полными - без “битых” (пустых) значений?

irgit
doc = (id, title, date, url, file, type_file, page_doc)
all_doc.append(doc)

Полагаю, вот такой вариант не годится.
 if not id or not title or not date...:
Как разом проверить все значения множества?


Отредактировано irgit (Июнь 13, 2019 11:03:27)

Офлайн

#6 Июнь 13, 2019 11:50:05

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1340
Репутация: +  200  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
Как разом проверить все значения множества?
ключевое слово “множества” используйте например пересечение множеств,

 a= {'1','2',''}
b={''}
print(a&b)
>>> 
{''}
>>>
если результирующее множество не пустое, значит в исходном есть пустые строки

Отредактировано PEHDOM (Июнь 13, 2019 11:53:05)

Офлайн

#7 Июнь 13, 2019 12:43:56

rami
Зарегистрирован: 2018-01-08
Сообщения: 191
Репутация: +  47  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Используйте функцию all():

 doc = my_id, title, date, url, file, type_file, page_doc = '', 'title', 'date', 'url', 'file', 'type_file', 'page_doc'
all(doc)
False

P.S. Не используйте для имени переменной id, т.к. это встроенная функция в Python.

Отредактировано rami (Июнь 13, 2019 12:47:52)

Офлайн

#8 Июнь 13, 2019 14:20:05

irgit
Зарегистрирован: 2018-02-04
Сообщения: 27
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

rami
Используйте функцию all():
Спасибо за хороший рецепт)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version