0

次の形式の数千のレコードを含む XML ファイルがあります。

<custs>
    <record cust_ID="B123456@Y1996" l_name="Jungle" f_name="George" m_name="OfThe" city="Fairbanks" zip="00010" current="1" />
    <record cust_ID="Q975697@Z2000" l_name="Freely" f_name="I" m_name="P" city="Yellow River" zip="03010" current="1" />
    <record cust_ID="M7803@J2323" l_name="Jungle" f_name="Jim" m_name="" city="Fallen Arches" zip="07008" current="0" />
</custs>
    #   (I know it's not normalized.  This is just sample data)

これを CSV またはタブ区切りファイルに変換するにはどうすればよいですか? re.compile() ステートメントを使用して Python でハードコーディングできることはわかっていますが、diff XML ファイル レイアウトの中で、より簡単で移植性の高い方法が必要です。

ここで、属性に関するいくつかのスレッドを見つけました ( Beautifulsoup は attrs=class を使用してデータを抽出できません、 Beautifulsoupで属性値を抽出しています)。

#  Python 3.30
#
from bs4 import BeautifulSoup
import fileinput

Input = open("C:/Python/XML Tut/MinGrp.xml", encoding = "utf-8", errors = "backslashreplace")
OutFile = open('C:/Python/XML Tut/MinGrp_Out.ttxt', 'w', encoding = "utf-8", errors = "backslashreplace")

soup = BeautifulSoup(Input, features="xml")

results = soup.findAll('custs', attrs={})

# output = results   [0]#[0]

for each_tag in results:
    cust_attrb_value = results[0]
#       print (cust_attrb_value)
    OutFile.write(cust_attrb_value)

OutFile.close()

次の(最後の?)ステップは何ですか?

4

2 に答える 2

2

このデータが正しくフォーマットされている場合 (正規の XML を使用している場合など) lxml、BeautifulSoup ではなく検討する必要があります。を使用lxmlすると、ファイルを読み取ってから、XPath クエリを含む DOM ロジックをファイルに適用できます。XPath クエリを使用lxmlして、関心のある各ノードを表すオブジェクトを取得し、それらから必要なデータを抽出し、csvモジュールなどを使用して、選択した任意の形式にそれらを書き換えることができます。

具体的には、lxml ドキュメントで、次のチュートリアルを確認してください。

于 2013-01-30T16:26:18.750 に答える
1

私は(また)これにBeautifulSoupを使用しません、そして私はlxmlが好きですが、それは追加のインストールです、そしてあなたが気にしたくないのであれば、これは標準のlibElementTreeモジュールで行うのに十分簡単です。

何かのようなもの:

import xml.etree.ElementTree as ET
import sys
tree=ET.parse( 'test.xml' )
root=tree.getroot()
rs=root.getchildren()
keys = rs[0].attrib.keys()
for a in keys: sys.stdout.write(a); sys.stdout.write('\t')
sys.stdout.write('\n')
for r in rs:
    assert keys == r.attrib.keys()
    for k in keys: sys.stdout.write( r.attrib[k]); sys.stdout.write('\t')
    sys.stdout.write('\n')

python-3から、以下を生成します:

zip m_name  current city    cust_ID l_name  f_name  
00010   OfThe   1   Fairbanks   B123456@Y1996   Jungle  George  
03010   P   1   Yellow River    Q975697@Z2000   Freely  I   
07008       0   Fallen Arches   M7803@J2323 Jungle  Jim 

Python-2.7では、属性の順序が異なることに注意してください。それらを異なる特定の順序で出力する場合は、リスト「キー」を並べ替えるか、順序付けする必要があります。

アサートは、すべての行が同じ属性を持っていることを確認しています。要素に実際に欠落している属性または異なる属性がある場合は、それを削除し、違いを処理して欠落している値のデフォルトを提供するコードを追加する必要があります。(サンプルデータには、欠落している値ではなくnull値(m_name = "")があります。このケースがこの出力のコンシューマーによって正常に処理されることを確認するか、または次の特別な処理を追加することをお勧めします。この場合。

于 2013-01-30T18:33:50.950 に答える