Парсинг pdf

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
Всем привет!
Есть PDF файл test.pdf. Нужно спарсить из таблицы ФИО и таб номер.

Накидал вот такой код, но он парсит данные не корректно. ФИО вообще не отображается :

Python:
import glob
import pandas as pd
import tabula

file = ("test.pdf")

pdf_files = glob.glob('*.pdf')

pdf_tables = tabula.read_pdf(file,
                             pages = 'all',
                             multiple_tables=True,
                             lattice=True,
                             encoding="windows-1251")

for table in pdf_tables:
    print(pdf_tables[0])

Что я делаю не так и как спарсить данные корректно ?
 

Вложения

  • test.pdf
    266,1 КБ · Просмотры: 3

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all')

print(dfs[0]["Unnamed: 0"])
print(dfs[0]["Табел."])
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all')

print(dfs[0]["Unnamed: 0"])
print(dfs[0]["Табел."])

У меня ругается на кодировку. Дополнил строку:

Python:
dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")

Но вывод не совсем корректный. Например вывод ФИО вместе с Функцией.

И как можно записать в список: Функцию, ФИО, Табельный ?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
И как можно записать в список: Функцию, ФИО, Табельный ?
не совсем понятно, так?
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")
lst_temp = []

for index, value in enumerate(dfs[0]["Unnamed: 0"]):
    if index == 0 or index == 1:
        continue
    lst_temp.append(f"{value} {dfs[0]['Табел.'][index]}")

print(lst_temp)
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
не совсем понятно, так?
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")
lst_temp = []

for index, value in enumerate(dfs[0]["Unnamed: 0"]):
    if index == 0 or index == 1:
        continue
    lst_temp.append(f"{value} {dfs[0]['Табел.'][index]}")

print(lst_temp)
Возможно да, но в дальнейшем мне нужно будет присвоить переменной часть элемента списка.

Код:
['КВС Иванов Иван Иванович 1111', '2 Пилот Петров Петр Петрович 2222', 'Старший бортпроводник Сидоров Сидор Сидорович 3333', 'Бортпроводник Михайлов Михаил Михаилович 4444', 'Бортпроводник Сергеев Сергей Сергеевич 5555', 'Бортпроводник Романов Роман Романович 6666', 'Бортпроводник Егоров Егор Егорович 7777']

Т.е допустим из нулевого элемента списка мне нужно будет присвоить переменной 'Иванов Иван Иванович'. Как можно это записать в переменную ?
Или как лучше записать данные прочитанные из pdf, чтобы удобно их брать в переменные и использовать в дальнейшем ?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Или как лучше записать данные прочитанные из pdf, чтобы удобно их брать в переменные и использовать в дальнейшем ?
смотря что вам нужно, словарь можно использовать

допустим из нулевого элемента списка мне нужно будет присвоить переменной 'Иванов Иван Иванович'. Как можно это записать в переменную ?
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")
lst_temp = []

for index, value in enumerate(dfs[0]["Unnamed: 0"]):
    if index == 0 or index == 1:
        continue
    lst_temp.append(f"{value} {dfs[0]['Табел.'][index]}")

s = " ".join(lst_temp[0].split()[1:-1])
print(s)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Или как лучше записать данные прочитанные из pdf, чтобы удобно их брать в переменные и использовать в дальнейшем ?
вот пример со словарем
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")
lst_temp = {}

for index, value in enumerate(dfs[0]["Unnamed: 0"]):
    if index == 0 or index == 1:
        continue
    lst_temp[index - 2] = [" ".join(value.split()[:-3]),
                           " ".join(value.split()[-3:]),
                           dfs[0]['Табел.'][index]]

print(lst_temp[0][1])
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
вот пример со словарем
Большое спасибо за примеры.
Подскажите еще как записать в отдельный список только столбец ФИО полученный из пдф файла ?
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
Как избавиться но таких ошибок и что они означают ?
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    189,3 КБ · Просмотры: 2

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Как избавиться но таких ошибок и что они означают ?
это не ошибки - это варнинги, то есть предупреждение, не знаю погуглите, скорее всего связано с выбранной вами кодировкой, в вашем тестовом файле таких варнингов не было

Подскажите еще как записать в отдельный список только столбец ФИО полученный из пдф файла ?
Python:
import tabula

dfs = tabula.read_pdf("test.pdf", pages='all', encoding="windows-1251")
lst_temp = {}

for index, value in enumerate(dfs[0]["Unnamed: 0"]):
    if index == 0 or index == 1:
        continue
    lst_temp[index - 2] = [" ".join(value.split()[:-3]),
                           " ".join(value.split()[-3:]),
                           dfs[0]['Табел.'][index]]

lst_fio = []
for i in lst_temp.items():
    lst_fio.append(i[1][1])

print(lst_fio)
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
это не ошибки - это варнинги, то есть предупреждение, не знаю погуглите, скорее всего связано с выбранной вами кодировкой, в вашем тестовом файле таких варнингов не было
да, вы правы это варнинги. Нашел как можно убрать, добавить silent=True
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
Подскажите как можно найти нужную таблицу в многостраничном документе ? При этом не известно какая это таблица по счету от начала документа.
Пытаюсь искать таблицу по названию первой колонки:

Python:
import tabula

tables = tabula.read_pdf("test10.pdf", pages='all', multiple_tables=True, silent=True, encoding="windows-1251")

for table in tables:
  if table.columns[0] == 'Функция':
      print(table.columns[1])

как продолжить работу с найденной таблицей ? Мне нужно забрать в список ФИО и Табельн.

Еще, поскольку файл многостраничный, я пытался искать таблицу на определенных страницах. Поскольку известно, что искомая таблица располагается на 3 или 4 странице документа. Пробовал вводить через запятую и диапазоном, но почему-то не сработало.

Так:
pages=[2,3]
И так:
pages=[2-3]
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
Поскольку известно, что искомая таблица располагается на 3 или 4 странице документа. Пробовал вводить через запятую и диапазоном, но почему-то не сработало.

Так:
pages=[2,3]
И так:
pages=[2-3]

диапазон указывается через двоеточие - pages=[2:3], но принимается ли в аргументах диапазон, не известно, можете посмотреть в исходниках
без примера файла я вам не помогу

PS
вы решили всю работу здесь спрашивать?
 

orlov1

Новичок
Пользователь
Июн 23, 2021
48
2
8
pages=[2:3]
Так ругается на синтаксис, а так вроде работает

pages=[3,4]
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
pages=[2:3]
Так ругается на синтаксис, а так вроде работает

pages=[3,4]
ну может быть...
 

Форум IT Специалистов