python -pptx не может извлечь текст из некоторых презентаций Powerpoint, но другие работают нормально - PullRequest
0 голосов
/ 03 апреля 2020

При попытке извлечь текстовые поля из большого каталога .pptx-файлов приведенный ниже скрипт отлично работает для некоторых презентаций Powerpoint:

from pptx import Presentation
import glob

f = open("Scraped PPTX Data.txt", "a", encoding='utf-8')
for eachfile in glob.glob("*.pptx"):
    prs = Presentation(eachfile)
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, "text"):
                f.write(shape.text)

f.close()

И все же для многих других (на вид очень больших) я получаю это Огромная стена ошибки:

  File "C:\Users\GLD-POS3\Desktop\SIGNS\PPT_Scraper.py", line 9, in <module>
    prs = Presentation(eachfile)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\api.py", line 28, in Presentation
    presentation_part = Package.open(pptx).main_document_part
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\package.py", line 125, in open
    pkg_reader = PackageReader.from_file(pkg_file)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 37, in from_file
    phys_reader, pkg_srels, content_types
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 70, in _load_serialized_parts
    for partname, blob, srels in part_walker:
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 106, in _walk_phys_parts
    phys_reader, part_srels, visited_partnames
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 106, in _walk_phys_parts
    phys_reader, part_srels, visited_partnames
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\pkgreader.py", line 103, in _walk_phys_parts
    blob = phys_reader.blob_for(partname)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\opc\phys_pkg.py", line 111, in blob_for
    return self._zipf.read(pack_uri.membername)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 1432, in read
    return fp.read()
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 885, in read
    buf += self._read1(self.MAX_N)
  File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 989, in _read1
    self._update_crc(data)
      File "C:\Users\GLD-POS3\AppData\Local\Programs\Python\Python37-32\lib\zipfile.py", line 917, in  _update_crc
raise BadZipFile("Bad CRC-32 for file %r" % self.name)
zipfile.BadZipFile: Bad CRC-32 for file 'ppt/media/image170.jpeg'

1 Ответ

1 голос
/ 04 апреля 2020

Когда вы видите исключение Python, вы должны сначала проверить конец. В этом случае он говорит:

Плохой CR C -32 для файла 'ppt / media / image170.jpeg'

Здесь нужно знать, что pptx Файл - это, по сути, просто zip-файл с причудливым именем.

Попробуйте запустить python -m zipfile -l filename.pptx Это должно перечислить содержимое файла pptx. Как правило, файл pptx содержит набор xml файлов, а также набор изображений и других мультимедийных файлов.

Из сообщения об ошибке видно, что контрольная сумма (CR C = cycli c проверка избыточности ), рассчитанная для image170.jpeg, не соответствует значению, хранящемуся в zip-файле.

AFAICT, нет способа указать ZipFile игнорировать ошибки CR C .

Дело в том, что при извлечении текста вам, вероятно, нужно только прочитать файлы XML в папке ppt/slides/slideN.xml внутри zip-файла. Вам вообще не нужен доступ к изображениям.

Попробуйте открыть недействительные файлы с помощью zipfile.ZipFile и вручную извлечь текст из файлов XML в ppt/slides.

...