Fanerka
@Fanerka

Как достать с pdf файла (с ссылки на pdf)?

6501f7c56ec05220627454.png

Мне нужно достать допусти для группы 3ИСИП-521 их пары
должно выводить т.к первой пары нет
Найдены следующие данные для группы 3ИСИП-521:
2 пара (10:10-11:40)
102 Абзалимов Ришат Рафикович
3 пара (12:20-13:50)
102 Абзалимов Ришат Рафикович
4 пара (14:00-14:45)
102 кл.час Абзалимов Ришат Рафикович
5 пара (15:00-16:30)
208 Записной Дмитрий Викторович
313 Попов Евгений Сергеевич
6 пара (16:40-18:10)
спорт.зал Киселев Алексей Сергеевич

А у меня выводит без какого либо порядка и без номера пары и времени, как вот сделать чтобы выводило по порядку?
Найдены следующие данные для группы 2ОИБАС-1022:
Ауд. спорт.зал Киселев Алексей Сергеевич
Ауд. 202 Маринич Анна Леонидовна

Вот код
import requests
import io
from telegram.ext import CommandHandler, Updater
from PyPDF2 import PdfReader

import config

def extract_data_from_text(text):
    data = []
    lines = text.split("\n")
    classroom = ""
    teacher_full = ""
    pair_num = ""
    start_index = 0  # Определите переменную start_index здесь

    for i, line in enumerate(lines):
        if "1 пара:" in line:
            pair_num = line.strip()  # Запоминаем текущий номер пары
            start_index = i + 1  # Устанавливаем значение start_index
        if i >= start_index:
            if "2ОИБАС-1022" in line:
                parts = line.split()
                if len(parts) > 3:
                    teacher_full = " ".join(parts[0:3])
                continue

            if teacher_full and "ауд." in line:
                parts = line.split()
                if len(parts) > 1:
                    classroom = parts[1]
                else:
                    classroom = ""

                data.append({'pair_num': pair_num, 'teacher': teacher_full, 'classroom': classroom})
                teacher_full = ""

    return data

def rasp_command(update, context):
    url = 'http://www.fa.ru/org/spo/kip/Documents/raspisanie/%d0%90%d1%83%d0%94%d0%98%d0%a2%d0%9e%d0%a0%d0%98%d0%98.pdf'
    response = requests.get(url)

    with io.BytesIO(response.content) as open_pdf_file:
        reader = PdfReader(open_pdf_file)
        num_pages = len(reader.pages)
        data = []

        for page_number, page in enumerate(reader.pages, start=1):
            text = page.extract_text()
            extracted_data = extract_data_from_text(text)
            if extracted_data:
                data.extend(extracted_data)

        if data:
            # Сортировка данных по номеру пары, если номер пары существует
            sorted_data = sorted(data, key=lambda x: int(x['pair_num'].split()[0]) if x['pair_num'] else 0)
            message = " Найдены следующие данные для группы 2ОИБАС-1022:"
            current_pair_num = None

            for entry in sorted_data:
                if entry['pair_num'] != current_pair_num:
                    current_pair_num = entry['pair_num']
                    message += f"\n{current_pair_num}"
                message += f"\n Ауд. {entry['classroom']} {entry['teacher']}"
        else:
            message = "Данные для группы 2ОИБАС-1022 не найдены"

    update.message.reply_text(message)

def main():
    updater = Updater(config.token, use_context=True)
    dispatcher = updater.dispatcher
    dispatcher.add_handler(CommandHandler("rasp", rasp_command))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()
  • Вопрос задан
  • 188 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Для таких задач тебе нужно спарсить этот pdf в pandas фрейм. Тогда твоя задача доставать из этой таблицы любые данные становится весьма тривиальной (В худшем случае несколько строк кода). Можно создать фрейм и используя твою библиотеку PyPDF2, но я предпочитаю tabula мощный парсер pdf таблиц (и он их парсит в фрейм по умолчанию), там возится особо не придется. https://tabula-py.readthedocs.io/en/latest/ там обрати внимание, нужно будет java поставить.

Гугли pdf table to pandas dataframe. И вперед вручную перебирать таблицы не нужно. Есть подходящие инструменты, которыми ты можешь и быстро и легко осуществлять выборки любой сложности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Фокус в том, что в PDF никакой таблицы нет.
Там тупо строчки по координатам, причем по координатам не центра ячейки, а начала строчки.
И любой перенос, а также смена шрифта (выделение полужирным, например) делит текст на несколько строчек.
Поэтому просто парсить текст не прокатит - несколько строчек развалятся, а пустые ячейки не определятся вовсе, и куда относится следующий после них текст - определить не получится.
На коленке можно попытаться сконвертировать PDF в более текстовый формат - EPS или SVG - и пытаться разобрать его, но это будет хоть и решаемой, но весьма трудоемкой задачей.
Предложенная выше библиотека, видимо, разбирает сам формат и пытается угадать по расположению строчек, как их собрать обратно в таблицу.
Других возможностей и каких-то простых решений можно не искать.

Кроме, разве что, возможности договориться получать там, где это расписание делается, не PDF, а DOCX/ODT, из которого его выгоняют ;)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы