2017-01-09 12 views
2

私は複数のテーブルを持つdocxファイルを持っています。リストのテーブルからすべての情報を取得したいのです(リストは 'alletabellen'と呼ばれます)。 以下のスクリプトでは、ドロップダウンリスト(一部の表のセル内)にある変数の値を除いて、表内のほとんどの情報を受け取ります。 これらのセルの値は私のリストでは空のままです(変数 'Number:'の値 '1.2'など、https://s30.postimg.org/477j8z6ch/table.pngを参照してください)。python-docx dropdownlist(テーブル)から情報を取得

これらの変数から情報を取得することは可能ですか?

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ファイルを含むzipファイルであることを認識しませんでした。モジュールzipfileを使用してdocxを抽出し、モジュールbs4を使用してすべてのドロップダウンリストタグ( 'ddList')を見つけ、リストにデータを入れました。私の文書には12のドロップダウンリストがあり、そのうち3つしか必要としませんでした(そのうちの1つはスクリーンショットの「番号:」で、これは文書の最初のドロップダウンリストです)。

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 

答えて

1

「1.2」は.text呼び出しから戻って来ていない理由は、フォームフィールドのように動作するために「コンテナ」XMLのいくつかの並べ替えに包まれています可能性が最も高いです。

最初のステップは、XMLを検査して、あなたが何を相手にしているかを確認することです。次に、埋め込まれたコンテンツを見つけるためのコードを記述します。あなたはdocument.xml一部で探してしたいと思う http://opc-diag.readthedocs.io/en/latest/index.html

opc-diagはあなたのXMLを検査することができます。

この動作を示す最小限に文書をトリミングすると、作業が必要な部分を簡単に見つけることができます。

テーブルのその部分のXMLを投稿すれば、私はさらにあなたを導くことができます。

+0

Omg、今日まで私はdocxファイルが実際には圧縮されたファイルであることを知らなかった!ご回答有難うございます。 私は、zipfileモジュールを使ってdocxを解凍し、/word/document.xmlを読んで、BeautifulSoupで特定の要素を調べるためにスクリプトにいくつかの行を追加しました。私はほとんどそこにいると思う。明日は私のスクリプトを終わらせようとします。 – Joost

関連する問題