私はいくつかのXMLファイルを持つディレクトリを持っています。いくつかのファイルは、文書の下部に以下の要素タグを持っている:pandasとbeautifulsoupを混ぜてxmlファイルのディレクトリからいくつかの要素タグを抽出するには?
<items>
<item id="id1" grocery="apple">
<stock id="id1.N1" alt="True" alt_id="10069227" type="fruit" type_id="10067060" />
</item>
<item id="id2" grocery="bannana">
<stock id="id2.N1" alt="True" alt_id="10015946" />
</item>
<item id="id3" grocery="orange">
<stock id="id3.N1" alt="True" alt_id="10019211" />
</item>
<item id="id4" grocery="garlic">
<stock id="id4.N1" alt="False" alt_id="10028810" />
</item>
<item id="id5" grocery="tomato">
<stock id="id5.N1" alt="False" alt_id="10020751" type="vegetable" type_id="10020756" />
</item>
<item id="id6" grocery="carrot">
<stock id="id6.N1" alt="False" alt_id="10037087" type="vegetable" type_id="10023084" />
</item>
<item id="AR7" grocery="onion">
<stock id="AR7.N1" alt="False" alt_id="10037844" />
</item>
<item id="id8" grocery="water mellon">
<stock id="id8.N1" alt="True" alt_id="10024570" type="fruit" type_id="10042703" />
</item>
<item id="id9" grocery="cherry">
<stock id="id9.N1" alt="True" alt_id="10042727" type="fruit" type_id="10042706" />
</item>
<item id="id10" grocery="Apricot">
<stock id="id10.N1" alt="False" alt_id="10034829" type="fruit" type_id="10043525" />
</item>
</items>
は、どのように私は、彼らが存在する場合items
タグ内部grocery
、type
、type_id
、alt
とalt_id
要素を抽出し、データフレームに保存することができます?存在しない値またはタグのために、私はNaN
を追加したいという
id grocery alt alt_id type type_id
id1 apple true 10069227 fruit 10067060
id2 bannana true 10015946 NaN NaN
id3 orange true 10019211 NaN NaN
id4 garlic false 10020751 vegerable 10020756
...
id10 apricot false 10034829 fruit 10043525
は注意してください。これまでのところ、私はしようとしました:
import glob
import re
import pandas as pd
from bs4 import BeautifulSoup
data = []
for filename in glob.glob('../dir/*xml'):
soup = BeautifulSoup(open(filename), "lxml")
for element1 in soup(re.compile(r"items")):
data.append({**element1.attrs, **{'filename': filename, 'type': element1.name}})
for element2 in soup(re.compile(r"stock")):
data.append({**element2.attrs, **{'filename': filename, 'type': element2.name}})
#print(element2)
df = pd.DataFrame(data)
しかし、その動作しません。あなたが見ることができるように、上記のコードは、私が興味を持って、いくつかのXMLラベルをommited
これは実際の出力です:。
filename grocery id type
0 /Users/user/Downloads/test.xml NaN NaN items
1 /Users/user/Downloads/test.xml NaN NaN items
2 /Users/user/Downloads/test.xml apple id1 item
3 /Users/user/Downloads/test.xml bannana id2 item
4 /Users/user/Downloads/test.xml orange id3 item
5 /Users/user/Downloads/test.xml garlic id4 item
6 /Users/user/Downloads/test.xml tomato id5 item
7 /Users/user/Downloads/test.xml carrot id6 item
8 /Users/user/Downloads/test.xml onion AR7 item
9 /Users/user/Downloads/test.xml water mellon id8 item
上記データフレームを取得する方法の任意のアイデア?
UPDATE
私のディレクトリ内のすべてのXMLファイルの@piRSquared答えを適応しようとした後、私が試した:
for filename in glob.glob('../dir/*xml'):
#soup = BeautifulSoup(open(filename), "lxml")
etree = ET.ElementPath(filename)
pd.DataFrame([obs2series(o) for o in etree.findall('item')])
しかし、私が得た:
---> 47 etree = ET.ElementPath(filename)
48 pd.DataFrame([obs2series(o) for o in etree.findall('item')])
49
TypeError: 'module' object is not callable
どのようにすることができます私はXMLの完全なディレクトリのためにそれを行う? `glob.globでのファイル名の( '../ TAC_2017 /データ/ train_xml/* XML'):しようとした後
etree = ET.ElementPath(ファイル名) pd.DataFrame([obs2series(私は 'TypeErrorを持っています: 'module'オブジェクトは呼び出し可能ではありません'どのように私のディレクトリ内のすべてのファイルに適用できますか? ! – tumbleweed
@tumbleweed beautifulsoupとxml_filesを使用するように更新しました – piRSquared
ありがとうございました。@piRSquared – tumbleweed