Python-docx提取的字符串缺少单词

时间:2018-05-11 22:58:54

标签: python python-3.x docx python-docx

我无法弄清楚为什么“Delaware”这个词没有从下面的代码中提取出来。每个其他角色都被提取出来任何人都可以提供从下面的Docx文件中提取单词“Delaware”的代码,而无需手动更改文件吗?

输入:

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)

输出:

  

适用法律   本协议应根据国家法律解释和解释,但不包括其法律冲突规定。 “联合国国际货物销售合同公约”的规定不适用于本协议。

关于它的最奇怪的部分是,如果我对文档中的“特拉华”(ee.gg.,粗体/非粗体,在文字上键入)这个词做任何事情,然后保存它,“特拉华”这个词就不是我下次运行代码时错过了更长的时间。但是,只保存文件而不更改单词不能解决问题。您可能会说解决方案是手动更改单词,但实际上我正在处理数千个这样的文档,并且逐个手动更改每个文档都没有意义。

Missing document text when using python-docx的答案似乎提供了为什么这个“特拉华”可能无法提取的原因,但它没有提供解决方案。感谢。

2 个答案:

答案 0 :(得分:2)

我相信@smci是对的。这很可能由以下原因解释:Missing document text when using 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.

答案 1 :(得分:0)

我也曾尝试使用Python-docx查找电子邮件,但没有用。

pip install docx2txt

这对我有用,可能有一些不必要的'\ n',如果需要,请用空格替换

import docx2txt
string = docx2txt.process("filepathandname.docx")