Найти - Пользователи
Полная версия: Говнокод. Научите изяществу
Начало » Python для новичков » Говнокод. Научите изяществу
1 2 3 4 5
irgit
rami
Вот мой вариант:

Спасибо огромное!!! Ваши уроки бесценны! Хороший код python - это поэзия, черт побери! Это круто!
irgit
Добрый день уважаемые эксперты. С учётом ваших замечаний написал парсер правовой информации с использованием 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)))
rami
irgit
С учётом ваших замечаний написал…
Не совсем с учётом

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

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

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

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

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

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

pravo
irgit
Возник такой вопрос, когда данные открыл в 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...:
Как разом проверить все значения множества?


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

 a= {'1','2',''}
b={''}
print(a&b)
>>> 
{''}
>>>
если результирующее множество не пустое, значит в исходном есть пустые строки
rami
Используйте функцию 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.
irgit
rami
Используйте функцию all():
Спасибо за хороший рецепт)
irgit
Здравствуйте. Осваиваю классы и не могу понять, как вызвать класс внутри класса. Посмотрите пожалуйста код, затык на вызове with connection.cursor() as cursor: Заранее благодарю за советы

 # -*- coding: utf-8 -*-
"""
Класс подключения к базе MSQL
"""
import pymysql.cursors
# Настройки базы
base = 'megaparser'
base_user = 'root'
base_pass = ''
class Connect_my_base(object):
    """Создаём соединение с базой"""
    def __init__(self, base, base_user, base_pass):
        """Инициализируем соединение"""
        self.base = base
        self.base_user = base_user
        self.base_pass = base_pass
    def sql_connection(self):
        """Соединяемся с базой"""
        connection = pymysql.connect(host='localhost',
                                     user=self.base_user,
                                     password=self.base_pass,
                                     db=self.base,
                                     charset='utf8mb4',
                                     cursorclass=pymysql.cursors.DictCursor)
        return connection
class Get_sql(object):
    """Делаем запрос к базе"""
    def __init__(self, sql, cursor):
        self.sql = sql
    def get_row(self):
        connection = Connect_my_base(base, base_user, base_pass)
# -- КАК ВЫЗВАТЬ pymysql.cursors к классу Connect_my_base?
# -- что-то типа with connection.cursor() as cursor:
irgit
irgit
Здравствуйте. Осваиваю классы и не могу понять, как вызвать класс внутри класса. Посмотрите пожалуйста код, затык на вызове with connection.cursor() as cursor: Заранее благодарю за советы

Переделал на вот такой класс. Посмотрите пожалуйста, как улучить класс

 # -*- coding: utf-8 -*-
"""
Класс подключения к базе MSQL
Автор Иргит Валерий
Пример: Connect_my_base(base, base_user, base_pass).get_site(sql)
"""
import pymysql.cursors
class Connect_my_base(object):
    """Создаём соединение с базой"""
    def __init__(self, base, base_user, base_pass):
        """Инициализируем соединение"""
        self.base = base
        self.base_user = base_user
        self.base_pass = base_pass
    def connect_base(self):
        """Соединяемся с базой"""
        connection = pymysql.connect(host='localhost',
                                     user=self.base_user,
                                     password=self.base_pass,
                                     db=self.base,
                                     charset='utf8mb4',
                                     cursorclass=pymysql.cursors.DictCursor)
        return connection
    def get_site(self, sql):
        connection = self.connect_base()
        with connection.cursor() as cursor:
            cursor.execute(sql)
            rows = cursor.fetchall()
            cursor.close()
            connection.close()
            return rows
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB