Найти - Пользователи
Полная версия: Цикл для поиска данных в егрюл
Начало » Python для новичков » Цикл для поиска данных в егрюл
1
PSAS
Здравствуйте!
Как можно написать цикл для выгрузки данных по Адресу юридического лица, например.
Начинается с Адреса юридического лица, а заканчивается поиск двумя цифрами, в данном случае 11.
Предположительно нужно посчитать всего строк в файле, найти которые начинаются с Адрес юридического лица и заканчиваются до двухзначной цифры, в данном случае 11.

 import fitz # pip install PyMuPDF
import re
doc = fitz.open('ul-1135007001029-20211205201715.pdf')
text = ''
for page in doc:
    text += page.get_text()
name = re.search('Полное наименование на русском языке\n+(.+)\n+(.+)', text)[0]
edit_name = lambda s: s.replace('','')
name=edit_name(name.replace('Полное наименование на русском языке',''))
name=edit_name(name.replace('\n',' '))
name=edit_name(name.replace(' ОБЩЕСТВО','ОБЩЕСТВО'))
name1=edit_name(name.replace('ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ','ООО'))
name2=edit_name(name.replace('ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ ',''))
date=re.findall('Дата регистрации\n+(.+)', text)[0]
capital=re.findall('Размер \(в рублях\)\n+(.+)', text)[0]
dolzhnost=re.findall('Должность\n+(.+)', text)[0]
director=re.findall('Отчество\n+(.+)+\n+(.+)+\n+(.+)', text)[0]
director=' '.join(director)
inn = re.findall('ИНН юридического лица\n+(.+)', text)[0]
ogrn = re.findall('ОГРН\n+(.+)', text)[0]
kpp = re.findall('КПП юридического лица\n+(.+)', text)[0]
okved = re.search('Код и наименование вида деятельности\n+(.+)', text)[0]
edit_okved = lambda s: s.replace('','')
okved=edit_okved(okved.replace('Код и наименование вида деятельности\n',''))
index = re.findall('Адрес юридического лица\n+(\d{6})', text)[0]
##y='Адрес юридического лица'
##
##for i in text:
##    count=0
##    if r in y:
##        if i==r:
##            count += 1
            
address = re.findall('Адрес юридического лица\n+(.+)\n+(.+)\n+(.+)\n+(.+)\n+(.+)\n+(.+)\n+(.+)', text)[0]
address=' '.join(address)
count = sum(1 for line in text if line.rstrip('\n'))
py.user.next
Сперва сделай из pdf-файла текстовый txt-файл. Дальше с этим текстовым txt-файлом работай. Не надо работать с pdf-файлами. Если нужен будет pdf-файл в конечном итоге, то его ты сделаешь из txt-файла, который у тебя будет к тому времени.

Это тебе первое задание. Напиши один отдельный скрипт конвертер из pdf в txt, который больше ничего не делает. И пусть он отдельно лежит. Им ты будешь только переводить файл из pdf в txt. Вот напиши и покажи, что ты в состоянии хоть что-то делать.
PSAS
Здравствуйте!
Этот код работает.
 import fitz
def extract_text():
    file=fitz.open('ul-1162375035470-20211205105157.pdf')
    for pageNumber, page in enumerate(file.pages(),start=1):
        text=page.get_text()
        #txt=open(f'report_Page_{pageNumber}.txt','a')
        txt=open('C:\\Python38\\Тест\\1.txt','a')
        txt.writelines(text)
        txt.close()
if(__name__ == "__main__"):
    extract_text()

Это код почему-то не работает
 import PyPDF2
import sys
# Открытие файла в бинарном режиме только для чтения, указатель файла в начале
read_pdf=open('ul-1162375035470-20211205105157.pdf','rb')
# Создание переменной чтения, которая будет считывать объект pdf-файла
reader_pdf=PyPDF2.PdfFileReader(read_pdf)
# Количество страниц pdf файла
num_pages=reader_pdf.numPages
# Cоздание переменной, которая будет выбирать выбранное количество страниц
convert_pages=reader_pdf.getPage(num_pages-1)
# Cоздание текстовой переменной, в которой будут храниться все текстовые данные из PDF-файла
extract_text=convert_pages.extractText()
# Сохранение данных в текстовый файл
location=open(r"C:\\Python38\\Тест\\1.txt","a")
location.writelines(extract_text)
location.close()
py.user.next
PSAS
Это код почему-то не работает
Это проблемы PyPDF2. Он требует какие-то особенные pdf-файлы. Типа самые самые правильные.

Кроме fitz из PyMuPDF можешь использовать ещё pdfminer.six.
PSAS
Добрый день, спасибо.
Следующий шаг - парсинг текстового файла для извлечения необходимых данных (наименование, адреса и т.д.) для сохранения в базу эксель и использования в шаблонах (например, word либо pdf)?
Можно использовать для этих целей модуль re или лучше pyparsing?

xam1816
 import fitz
import re
def get_text(pdf_file):# получает текст из pdf
    print(pdf_file)
    doc = fitz.open(pdf_file)
    text = ''
    for page in doc:
        text += page.get_text()
    doc.close()
    # print(text.encode('1251', 'ignore').decode('1251'))
    return text # возвращает str
def get_data(text):
    address = None
    if match := re.search('(?<=Адрес юридического лица\n)(.|\n)+?(?=\n11\n)', text):
        address = match[0]
    return address
text = get_text('egrn.pdf')
print(get_data(text))

вывод
 350049,
Краснодарский край,
Г.О. ГОРОД КРАСНОДАР,
Г КРАСНОДАР,
УЛ КРАСНЫХ ПАРТИЗАН,
Д. 108,
ПОМЕЩ. 4
py.user.next
PSAS
Следующий шаг - парсинг текстового файла для извлечения необходимых данных (наименование, адреса и т.д.) для сохранения в базу эксель и использования в шаблонах (например, word либо pdf)?
Дальше ты берёшь текстовый файл, который получился, и используешь его так, будто он не из pdf-файла был получен, а как будто он и был у тебя изначально. И вот для этого txt-файла ты ставишь задачу.

Пример
Дано    : текстовый файл input.txt с данными одной записи на разных строках
Получить: текстовый файл output.txt с адресом юридического лица

Пример
Дано    : текстовый файл input.txt с данными одной записи на разных строках
Получить: текстовый файл output.txt с наименованием, адресом юридического лица и ИНН юридического лица на разных строках

Нет никакого pdf-файла у тебя больше. А конвертер из pdf в txt лежит в отдельном скрипте, который живёт своей жизнью. Если завтра вдруг он перестанет конвертировать pdf в txt, то тебе нужно будет заменить только содержимое того скрипта. При этом основной скрипт по работе с данными ты не трогаешь. Он как работал исправно, так и работает.

Понимаешь, fitz может сегодня работать, а через месяц грохнется. Или он с сегодняшними твоими файлами работает, а через месяц у тебя появятся такие pdf-файлы, для которых он станет пустоту выдвать вместо текста. Чтобы из-за этого основной код не трогать, который работает с простым текстом, ты эту часть по конвертированию из pdf в txt выносишь в отдельный скрипт. Ну и ещё существует вероятность того, что через месяц ты эти данные будешь получать не в виде pdf-файлов, а в виде csv-файлов или в виде json-файлов или ещё чего-нибудь, да даже просто в виде текстовых файлов. Тогда зачем тебе в коде вообще преобразование из pdf, если pdf-файлов больше нет? Тогда ты начнёшь скоропостижно переписывать код с pdf-файлов на csv-файлы и тому подобное и конечно же всё сломаешь, что раньше работало без проблем. Самое смешное начнётся, когда тебе будут приходить файлы и в pdf, и в csv, и ещё в чём-нибудь, а ты уже к этому времени сломал pdf-конвертацию. Вот чтобы этого не было, ты просто держишь эти преобразователи в отдельных скриптах (для pdf - pdf-скрипт, для csv - csv-скрипт, для json - json-скрипт, для html - html-скрипт и так далее), а чистый код, который и делает фильтрацию всю, ты держишь в одном скрипте, который, если и меняется, то только чтобы лучше, больше и точнее выбирать данные.

Чтобы вот это всю хрень тебе не разъяснять, а там много всякой хрени такой, я тебе и пишу сразу “помести это в отдельный скрипт”, “работай только с простыми текстовыми файлами”.

Когда не знаешь, как обработать текстовый файл, а это бывает очень сложно, тогда ты спрашиваешь “скажите, как обработать этот текстовый файл, когда задача уменя поставлена вот так-то и так-то?” и присылаешь этот input.txt в точном виде. И там тебе уже говорят “надо использовать re” или “надо нумеровать строки и взять пятую” или “надо взять строки попарно, склеить их через str.join() и взять третью пару” и так далее.
PSAS
Здравствуйте!
Дано : текстовый файл input.txt с данными одной записи на разных строках
Получить: данные о всех ОКВЭДах находящимися на разных строках.

op_okved = None # значение по умолчанию
dop_okved_shablon = re.compile('Код и наименование вида деятельности\n+(.+)\n+(.+)\n+(.+)')
dop_okved = (dop_okved_shablon.findall(text))
dop_okved = ‘\n’.join(' '.join(tup) for tup in dop_okved)

В выгрузке получаются лишние данные
42.91 Строительство водных сооружений 54 ГРН и дата внесения в ЕГРЮЛ записи,
41.10 Разработка строительных проектов 56 ГРН и дата внесения в ЕГРЮЛ записи,
41.20 Строительство жилых и нежилых зданий 58
42.11 Строительство автомобильных дорог и автомагистралей 60
42.12 Строительство железных дорог и метро 62
42.13 Строительство мостов и тоннелей 64 ГРН и дата внесения в ЕГРЮЛ записи,
42.21 Строительство инженерных коммуникаций для водоснабжения и водоотведения, газоснабжения
42.22 Строительство коммунальных объектов для обеспечения электроэнергией и телекоммуникациями
42.99 Строительство прочих инженерных сооружений, не включенных в другие группировки
43.11 Разборка и снос зданий 72 ГРН и дата внесения в ЕГРЮЛ записи,
43.12 Подготовка строительной площадки 74 ГРН и дата внесения в ЕГРЮЛ записи,
43.13 Разведочное бурение 76 ГРН и дата внесения в ЕГРЮЛ записи,
43.21 Производство электромонтажных работ 78
43.22 Производство санитарно-технических работ, монтаж отопительных систем и систем кондиционирования воздуха
43.29 Производство прочих строительно- монтажных работ 82
43.31 Производство штукатурных работ 84 ГРН и дата внесения в ЕГРЮЛ записи,
43.32 Работы столярные и плотничные 86 ГРН и дата внесения в ЕГРЮЛ записи,
43.33 Работы по устройству покрытий полов и облицовке стен 88
43.34 Производство малярных и стекольных работ 90
43.39 Производство прочих отделочных и завершающих работ 92
43.91 Производство кровельных работ 94 ГРН и дата внесения в ЕГРЮЛ записи,
43.99 Работы строительные специализированные прочие, не включенные в другие группировки
74.90 Деятельность профессиональная, научная и техническая прочая, не включенная в другие группировки
py.user.next
PSAS
В выгрузке получаются лишние данные
Шаблон у тебя расчитан так, чтобы брать три строки под строкой “Код и наименование вида деятельности”. Но в записях в текстовом файле там бывает три строки, а бывает две строки. Теоретически там может быть и одна строка, и десять строк, поэтому надо это всё учесть.

Проблема здесь в том, что ты не причесал текстовые данные перед их обработкой.

1. Сначала нужно получить текстовые данные из pdf.
2. Потом надо привести текстовые данные к очищенному виду.
3. И после этого можно в очищенных текстовых данных что-то искать.

Очистка данных может включать в себя удаление лишних строк, может включать в себя склеивание разделённых строк, а может включать в себя добавление новых строк. Также можно не строки добавлять, а какие-то метки специальные, по которым можно потом легко отыскивать определённые фрагменты.

Сделай скрипт, который из сырых текстовых данных делает нормализованные текстовые данные. Нормализованные данные - это данные, у которых точно известна форма, в которых есть всё необходимое и из которых удалено всё лишнее.

Например, тебе не нужны номера страниц в данных - удали номера страниц. Они там из pdf-файла получились, но для поиска-то они не нужны. Поэтому их можно все найти и удалить. Тогда данные станут чище, тогда не нужно будет эти номера страниц там перескакивать при поиске.

То же самое с разорванными строками. Ты видишь, что какая-то строка была целая изначально, а при конвертации из pdf-файла она разделилась на две строки, - соедини её обратно в одну строку.

Какие-то строки тебе вообще нафиг не нужны - так удали их просто.

Так что скрипт нормализации, который тоже должен отдельно храниться, берёт сырые данные из текстового файла и делает нормализованные данные в другом текстовом файле.

И вот в нормализованных данных ты уже будешь искать скриптом поиска.

Таким образом, у тебя должен быть скрипт конвертации из pdf в txt, у тебя должен быть скрипт нормализации из txt в txt, у тебя должен быть скрипт поиска из txt в txt и у тебя должен быть скрипт-управленец, который эти скрипты запускает друг за другом по цепочке.
xam1816
PSAS
В выгрузке получаются лишние данные
  
search = re.findall(r'(?<=Код и наименование вида деятельности\n).+\n?\D+(?=\n\d+\n)', text)
out = '\n'.join(i.replace('\n', '')for i in search)
print(out)

42.91 Строительство водных сооружений
41.10 Разработка строительных проектов
41.20 Строительство жилых и нежилыхзданий
42.11 Строительство автомобильных дороги автомагистралей
42.12 Строительство железных дорог иметро
42.13 Строительство мостов и тоннелей
42.21 Строительство инженерныхкоммуникаций для водоснабжения иводоотведения, газоснабжения
42.22 Строительство коммунальныхобъектов для обеспечения электроэнергиейи телекоммуникациями
42.99 Строительство прочих инженерныхсооружений, не включенных в другиегруппировки
43.11 Разборка и снос зданий
43.12 Подготовка строительной площадки
43.13 Разведочное бурение
43.21 Производство электромонтажныхработ
43.22 Производство санитарно-техническихработ, монтаж отопительных систем исистем кондиционирования воздуха
43.29 Производство прочих строительно-монтажных работ
43.31 Производство штукатурных работ
43.32 Работы столярные и плотничные
43.33 Работы по устройству покрытийполов и облицовке стен
43.34 Производство малярных истекольных работ
43.39 Производство прочих отделочных изавершающих работ
43.91 Производство кровельных работ
43.99 Работы строительныеспециализированные прочие, невключенные в другие группировки
74.90 Деятельность профессиональная,научная и техническая прочая, невключенная в другие группировки
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