Python-docx извлеченная строка отсутствует слово - PullRequest
0 голосов
/ 12 мая 2018

Я не могу понять, почему слово «Делавэр» не извлекается из кода ниже. Любой другой персонаж извлекается. Кто-нибудь может предоставить код, который извлекает слово «Делавэр» из файла Docx ниже, без изменения файла вручную?

Введите:

import docx
import io
import requests

url = 'https://github.com/python-openxml/python-docx/files/1996979/Delaware_Test.docx'
file = io.BytesIO(requests.get(url).content)

for text in docx.Document(file).paragraphs:
    print(text.text)

Выход:

ПРИМЕНИМОЕ ЗАКОНОДАТЕЛЬСТВО Настоящее Соглашение подлежит толкованию и толкованию в соответствии с законодательством государства, за исключением его коллизионных норм. Положения Конвенции США о договорах международной купли-продажи товаров не применяются к настоящему Соглашению.

Самое странное в этом то, что если я сделаю что-нибудь со словом «Делавэр» (например, полужирный / полужирный, наберите слово) в документе, а затем сохраню его, слово «Делавэр» будет больше не хватает в следующий раз, когда я запускаю код. Однако простое сохранение файла без изменения слова не решает проблему. Вы можете сказать, что решение состоит в том, чтобы вручную изменить слово, но на самом деле я имею дело с тысячами этих документов, и нет смысла вручную изменять каждый документ по одному.

Ответ на Отсутствует текст документа при использовании python-docx , по-видимому, объясняет, почему этот «Делавэр» не может быть извлечен, но он не предоставляет решения. Спасибо.

1 Ответ

0 голосов
/ 12 мая 2018

Я верю, что @smci прав.Скорее всего, это объясняется следующим: Отсутствует текст документа при использовании python-docx .Однако это не дает решения.

Я думаю, что наша единственная альтернатива в этом случае - вернуться к чтению XML-файла.Рассмотрим эту функцию (упрощенно) с веб-страницы http://etienned.github.io/posts/extract-text-from-word-docx-simply/, например:

try:
    from xml.etree.cElementTree import XML
except ImportError:
    from xml.etree.ElementTree import XML
import zipfile
import io
import requests    

def get_docx_text(path):
    """Take the path of a docx file as argument, return the text in unicode."""

    WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
    PARA = WORD_NAMESPACE + 'p'
    TEXT = WORD_NAMESPACE + 't'

    document = zipfile.ZipFile(path)
    xml_content = document.read('word/document.xml')
    document.close()
    tree = XML(xml_content)

    paragraphs = []
    for paragraph in tree.getiterator(PARA):
        texts = [n.text for n in paragraph.getiterator(TEXT) if n.text]
        if texts:
            paragraphs.append(''.join(texts))

    return '\n\n'.join(paragraphs)

url = 'https://github.com/python-openxml/python-docx/files/1996979/Delaware_Test.docx'
file = io.BytesIO(requests.get(url).content)
print(get_docx_text(file))

И мы получим:

APPLICABLE LAW

This Agreement is to be construed and interpreted according to the laws of the State of Delaware, excluding its conflict of laws provisions.  The provisions of the U. N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement.
...