【问题标题】:python-docx get info from dropdownlist (in table)python-docx 从下拉列表中获取信息(在表格中)
【发布时间】:2017-05-23 20:49:30
【问题描述】:

我有一个包含多个表的 docx 文件,我想从列表中的表中获取所有信息(该列表称为“alletabellen”)。 通过下面的脚本,我收到了表格中几乎所有的信息,除了下拉列表中的一些变量的值(在一些表格单元格中)。 这些单元格的值在我的列表中保持为空(例如,变量“Number:”中的值“1.2”,请参阅:https://s30.postimg.org/477j8z6ch/table.png我的列表中没有该值)。

是否也可以从这些变量中获取信息?

import docx

bestand = docx.Document('somefile.docx')
tabellen = bestand.tables

alletabellen = []     
for i, tabel in enumerate(tabellen):
    for row in tabellen[i].rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                alletabellen.append(paragraph.text)

更新

我找到了解决方案(感谢 scanny 指出我正确的方向)。 我没有意识到 docx 文件实际上是一个带有 xml 文件的压缩文件,其中包含所有文本。我使用模块 zipfile 提取 docx 和模块 bs4 来查找所有下拉列表标签('ddList')并将数据放入列表中。在我的文档中有 12 个下拉列表,我只需要其中的 3 个(其中一个是屏幕截图中的“数字:”,这是文档中的第一个下拉列表)。

import docx
import zipfile
from bs4 import BeautifulSoup

doc = 'somefile.docx'

bestand = docx.Document(doc)
tabellen = bestand.tables

#get data from all the "normal" fields

alletabellen = []     
for i, tabel in enumerate(tabellen):
    for row in tabellen[i].rows:
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                alletabellen.append(paragraph.text)

#get data from all the dropdown lists

document = zipfile.ZipFile(doc)
xml_data = document.read('word/document.xml')
document.close()

soup = BeautifulSoup(xml_data, 'xml')
gegevens = soup.findAll('ddList')     #search dropdownlists (n = 12)

dropdownlist = []
dropdownlistdata = []

for i in gegevens:
    dropdownlist.append(i.find('result'))

#convert to string for if statements
number = str(dropdownlist[0])
job = str(dropdownlist[1])
vehicle = str(dropdownlist[7])

if number == '<w:result w:val="1"/>' :
    dropdownlistdata.append('0,3')
elif number == '<w:result w:val="2"/>' :
    dropdownlistdata.append('1,2')
elif number == '<w:result w:val="3"/>' :
    dropdownlistdata.append('onbekend')
else:
    dropdownlistdata.append('geen')

if job  == '<w:result w:val="1"/>' :
    dropdownlistdata.append('nee')
else:
    dropdownlistdata.append('ja')

if vehicle == '<w:result w:val="1"/>' :
    dropdownlistdata.append('nee')
else:
    dropdownlistdata.append('ja')

#show data
print alletabellen
print dropdownlistdata

【问题讨论】:

    标签: python python-docx


    【解决方案1】:

    '1.2' 没有从 .text 调用中返回的原因很可能是它被包装在某种“容器”XML 中,使其表现得像一个表单字段。

    第一步是检查 XML,以便您了解遇到的问题。然后你会写一些代码来找到隐藏的内容。

    opc-diag 可以帮助您检查您的 XML: http://opc-diag.readthedocs.io/en/latest/index.html

    您会想查看document.xml 部分。

    如果您将文档缩减到只显示此行为的最小值,则可以更轻松地找到您需要处理的部分。

    如果您可以发布表格那部分的 XML,我可以进一步指导您。

    【讨论】:

    • 天哪,直到今天我才知道 docx 文件实际上是一个压缩文件!感谢您的回答。我在脚本中添加了一些行来解压缩 docx(使用 zipfile 模块),读取 /word/document.xml 并使用 BeautifulSoup 查找特定元素。我想我快到了。明天我会努力完成我的剧本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多