Не читается word-файл в коде python

Почему не читается и не выводится на print содержание word-файла в коде python:

import bs4
import time
import random
import requests
import docx
from bs4 import BeautifulSoup
from requests_html import HTMLSession
import magic
import chardet
import codecs
from io import BytesIO
from docx import Document

from selenium import webdriver  # pip install selenium


# Список пользовательских агентов
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.4 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
]


# Функция для получения случайного пользовательского агента
def get_random_user_agent():
    return random.choice(user_agents)


# Настройка браузера
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f"user-agent={get_random_user_agent()}")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)

data = []
# Использование webdriver

session = HTMLSession()
response = session.get(
    "https://mos-gorsud.ru/mgs/search?caseDateFrom=16.02.2023&caseDateTo=28.02.2023&courtAlias=mgs&documentStatus=2&processType=6&formType=fullForm&page=2")
time.sleep(3)  # Дополнительная задержка на случай, если нужно, но избегайте чрезмерного использования sleep

soup = BeautifulSoup(response.text, 'html.parser')
heads = soup.find('table', class_='custom_table').find_all('tr')
print(len(heads))
for head in heads[1:]:
    link = 'https://mos-gorsud.ru' + head.find('nobr').find('a')['href']
    print(link)
    loom = session.get(link)
    abble = BeautifulSoup(loom.text, 'html.parser')
    
    documents = abble.find('table', {'class': 'custom_table mainTable'}).find('tbody').find_all('tr')
    for document in documents:
        if "Приговор" in document.text:
            score = document.find_all('td')

            print(len(score))
            for soc in score:
                stock = soc.find_all('a')
                for sto in stock:
                    print('Prigovor: ' + 'https://mos-gorsud.ru' + sto['href'])
                    link_doc = 'https://mos-gorsud.ru' + sto['href']
                    response = requests.get(link_doc, get_random_user_agent())

                    # Проверка успешности запроса
                    if response.status_code == 200:
                        # Сохранение файла на диск
                        with open('prigovor.docx', 'wb') as file:
                            file.write(response.content)

                        # Открытие Word-документа и извлечение текста
                        document = Document('prigovor.docx')
                        text = '\n'.join([paragraph.text for paragraph in document.paragraphs])
                        resheniye = ' '.join(text.split())

                        # Вывод ссылки и текста
                        print('Ссылка на файл: https://mos-gorsud.ru' + sto['href'])
                        print(resheniye)
                    else:
                        print(f"Error downloading file: {response.status_code}")

        elif "Постановление суда апелляционной инстанции" in document.text:
            score = document.find_all('td')

            print(len(score))
            for soc in score:
                stock = soc.find_all('a')
                for sto in stock:
                    print('Postanovleniye : ' + 'https://mos-gorsud.ru' + sto['href'])
                    link_pod = 'https://mos-gorsud.ru' + sto['href']
                    response = requests.get(link_pod, get_random_user_agent())

                    # Проверка успешности запроса
                    if response.status_code == 200:
                        # Сохранение файла на диск
                        with open('resheniye.docx', 'wb') as file:
                            file.write(response.content)

                        # Открытие Word-документа и извлечение текста
                        document = Document('resheniye.docx')
                        text = '\n'.join([paragraph.text for paragraph in document.paragraphs])
                        postanov = ' '.join(text.split())

                        # Вывод ссылки и текста
                        print('Ссылка на файл: https://mos-gorsud.ru' + sto['href'])
                        print(postanov)
                    else:
                        print(f"Error downloading file: {response.status_code}")

            print('\n')

Пишет это:

Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\cases_pars\little.py", line 143, in <module>
    document = Document('resheniye.docx')
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\cases_pars\.venv\Lib\site-packages\docx\api.py", line 27, in Document
    document_part = cast("DocumentPart", Package.open(docx).main_document_part)
                                         ^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\cases_pars\.venv\Lib\site-packages\docx\opc\package.py", line 127, in open
    pkg_reader = PackageReader.from_file(pkg_file)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\cases_pars\.venv\Lib\site-packages\docx\opc\pkgreader.py", line 22, in from_file
    phys_reader = PhysPkgReader(pkg_file)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\cases_pars\.venv\Lib\site-packages\docx\opc\phys_pkg.py", line 21, in __new__
    raise PackageNotFoundError("Package not found at '%s'" % pkg_file)
docx.opc.exceptions.PackageNotFoundError: Package not found at 'resheniye.docx'

Ответы (2 шт):

Автор решения: Evgenii Evstafev

По всей видимости, ошибка возникает из-за того, что

document = Document('resheniye.docx')

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

Для решения проблемы можно попробовать следующее:

  1. Использовать корректное задание заголовков в запросе. Вместо передачи пользовательского агента как позиционного аргумента, следует передавать его через параметр headers. Например, замените

    requests.get(link_pod, get_random_user_agent())
    

    на

    requests.get(link_doc, headers={"User-Agent": get_random_user_agent()})
    
  2. Передавать файл из памяти напрямую в Document, можно попробовать:

    import requests
    from io import BytesIO
    from docx import Document
    
    link_doc = "https://calibre-ebook.com/downloads/demos/demo.docx"
    
    response = requests.get(link_doc) # , headers={"User-Agent": get_random_user_agent()}
    
    if response.status_code == 200:
       document = Document(BytesIO(response.content))
       for para in document.paragraphs:
          print(para.text)
    
  3. Добавить блок try-except для трассировки ошибок. Это позволит отлавливать исключения и получать более подробную информацию о проблеме:

    try:
        document = Document('resheniye.docx')
    except Exception as e:
        print(f"Ошибка при открытии файла: {e}")
    

PS: Кроме того, рекомендую изменить структуру кода для избежания дублирования. Например, можно переместить проверку условий if "Приговор" in document.text и elif "Постановление суда апелляционной инстанции" in document.text внутрь цикла for soc in score:, чтобы избежать повторения кода.

→ Ссылка
Автор решения: Vyacheslav

РЕШЕНИЕ:

import bs4
import time
import random
import requests
import docx
from requests_html import HTMLSession
from win32com.client import Dispatch
import codecs
from io import BytesIO
from docx import Document
from selenium import webdriver  # pip install selenium
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager  # pip install webdriver-manager

# Список пользовательских агентов
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.4 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
]


# Функция для получения случайного пользовательского агента
def get_random_user_agent():
    return random.choice(user_agents)


# Настройка браузера
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(f"user-agent={get_random_user_agent()}")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)

data = []
# Использование webdriver
with webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) as driver:
    driver.maximize_window()
    driver.get(
        "https://mos-gorsud.ru/mgs/search?caseDateFrom=16.02.2023&caseDateTo=28.02.2023&courtAlias=mgs&documentStatus=2&processType=6&formType=fullForm&page=2")

    time.sleep(3)  # Дополнительная задержка на случай, если нужно, но избегайте чрезмерного использования sleep

    soup = bs4.BeautifulSoup(driver.page_source, 'html.parser')
    heads = soup.find('table', class_='custom_table').find_all('tr')
    print(len(heads))
    for head in heads[1:]:
        link = 'https://mos-gorsud.ru' + head.find('nobr').find('a')['href']
        # print(link)
        driver.get(link)

        time.sleep(3)  # Дополнительная задержка на случай, если нужно, но избегайте чрезмерного использования sleep

        soup = bs4.BeautifulSoup(driver.page_source, 'html.parser')
        documents = soup.find('table', {'class': 'custom_table mainTable'}).find('tbody').find_all('tr')
        for document in documents:
            if "Приговор" in document.text:
                score = document.find_all('td')

                print(len(score))
                for soc in score:
                    stock = soc.find_all('a')
                    for sto in stock:
                        # print('Prigovor : ' + 'https://mos-gorsud.ru' + sto['href'])
                        link_doc = 'https://mos-gorsud.ru' + sto['href']
                        session = HTMLSession()
                        response = session.get(
                            link_doc)

                        with open("prigovor.doc", "wb") as file:
                            file.write(response.content)


                            def convert_prigovor_to_docx(input_file, output_file):
                                """
                                Конвертирует файл .doc в .docx формат.

                                Аргументы:
                                input_file -- путь к входному файлу .doc
                                output_file -- путь к выходному файлу .docx
                                """
                                word = Dispatch("Word.Application")
                                word.Visible = False

                                try:
                                    doc = word.Documents.Open(input_file)
                                    doc.SaveAs2(output_file, FileFormat=16)  # 16 - формат .docx
                                    doc.Close()
                                except Exception as e:
                                    print(f"Ошибка при конвертации файла: {e}")
                                finally:
                                    word.Quit()

                                # Пример использования


                            input_file = r"C:\Users\user\PycharmProjects\cases_pars\\prigovor.doc"
                            output_file = r"C:\Users\user\PycharmProjects\cases_pars\\prigovor.docx"
                            convert_prigovor_to_docx(input_file, output_file)

                            # Открытие Word-документа и извлечение текста
                            document = Document("C:\\Users\\user\PycharmProjects\cases_pars\\prigovor.docx")
                            text = '\n'.join([paragraph.text for paragraph in document.paragraphs])
                            prigovor = ' '.join(text.split())

                            # Вывод ссылки и текста
                            print('Ссылка на файл: https://mos-gorsud.ru' + sto['href'])
                            print(prigovor)
                    else:
                        print(f"Error downloading file: {response.status_code}")

            elif "Постановление суда апелляционной инстанции" in document.text:
                score = document.find_all('td')

                print(len(score))
                for soc in score:
                    stock = soc.find_all('a')
                    for sto in stock:
                        # print('Postanovleniye : ' + 'https://mos-gorsud.ru' + sto['href'])
                        link_pod = 'https://mos-gorsud.ru' + sto['href']
                        session = HTMLSession()
                        response = session.get(
                            link_pod)

                        with open("resheniye.doc", "wb") as file:
                            file.write(response.content)


                        def convert_doc_to_docx(input_file, output_file):
                            """
                            Конвертирует файл .doc в .docx формат.

                            Аргументы:
                            input_file -- путь к входному файлу .doc
                            output_file -- путь к выходному файлу .docx
                            """
                            word = Dispatch("Word.Application")
                            word.Visible = False

                            try:
                                doc = word.Documents.Open(input_file)
                                doc.SaveAs2(output_file, FileFormat=16)  # 16 - формат .docx
                                doc.Close()
                            except Exception as e:
                                print(f"Ошибка при конвертации файла: {e}")
                            finally:
                                word.Quit()

                            # Пример использования


                        input_file = r"C:\Users\user\PycharmProjects\cases_pars\\resheniye.doc"
                        output_file = r"C:\Users\user\PycharmProjects\cases_pars\\resheniye.docx"
                        convert_doc_to_docx(input_file, output_file)

                        # Открытие Word-документа и извлечение текста
                        document = Document("C:\\Users\\user\PycharmProjects\cases_pars\\resheniye.docx")
                        text = '\n'.join([paragraph.text for paragraph in document.paragraphs])
                        resheniye = ' '.join(text.split())

                        # Вывод ссылки и текста
                        print('Ссылка на файл: https://mos-gorsud.ru' + sto['href'])
                        print(resheniye)
                else:
                    print(f"Error downloading file: {response.status_code}")

            print('\n')
→ Ссылка