[英]How to iterate over XML tags in Python using ElementTree & save to CSV
[英]Iterate over particular child nodes in XML and save to CSV using Python
我已經瀏覽了許多類似的問題,但沒有找到能夠專門解決此問題的答案。 我以前沒有在python中使用XML文件,而且時間緊迫,所以我可能只是忽略了顯而易見的內容。 對於文件中的每個提供者記錄,我有一堆XML文件,我只需要從中獲取兩個值即可。 我需要將其保存在csv中。
我有一些代碼比我期望的要多...
import xml.etree.ElementTree as ET
import csv
tree = ET.parse('xml/HSP-FullOutOfAreaSite03-DEC.xml')
root = tree.getroot()
for PROVIDER in root.iter('PROVIDER'):
for PROV_IDENTIFIER in PROVIDER:
print(PROV_IDENTIFIER.text)
for TAXONOMY_CODE in PROVIDER:
print(TAXONOMY_CODE.text)
XML有很多重復的PROVIDER_GROUP,對於所有提供者組中的每個提供者,我需要提供者的PROV_IDENTIFIER和TAXONOMY_CODE。
<PROVIDER_GROUP>
<MASTER_GROUP_CODE>345093845</MASTER_GROUP_CODE>
<TAX_ID>3095</TAX_ID>
<GROUPNUMBER>16</GROUPNUMBER>
<SITECOUNT>1</SITECOUNT>
<CONTRACTS>
<CONTRACT>
<EFF_DATE>2002-01-01</EFF_DATE>
</CONTRACT>
</CONTRACTS>
<PROVIDER_SITES>
<PROVIDER_SITE>
<PROV_MASTER_ID>18583783745</PROV_MASTER_ID>
<MASTER_GROUP_CODE>584293845</MASTER_GROUP_CODE>
<PROVIDERS>
<PROVIDER>
<PROVNO>123456</PROVNO>
<NAME_FIRST>John</NAME_FIRST>
<NAME_LAST>Doe</NAME_LAST>
<NAME_CREDENTIAL>DDD</NAME_CREDENTIAL>
<GENDER>M</GENDER>
<PROV_IDENTIFIER>3459832385</PROV_IDENTIFIER>
<TAXONOMIES>
<TAXONOMY>
<TAXONOMY_CODE>23498R98239X</TAXONOMY_CODE>
</TAXONOMY>
</TAXONOMIES>
<HOSPRELATIONS>
<HOSP>
<NPI>1366896300</NPI>
</HOSP>
</HOSPRELATIONS>
</PROVIDER>
<PROVIDER>
<PROVNO>123454</PROVNO>
<NAME_FIRST>Jane</NAME_FIRST>
<NAME_LAST>Doe</NAME_LAST>
<NAME_CREDENTIAL>DDD</NAME_CREDENTIAL>
<GENDER>F</GENDER>
<PROV_IDENTIFIER>3945092358</PROV_IDENTIFIER>
<TAXONOMIES>
<TAXONOMY>
<TAXONOMY_CODE>55598R98239X</TAXONOMY_CODE>
</TAXONOMY>
</TAXONOMIES>
<HOSPRELATIONS>
<HOSP>
<NPI>34598345030</NPI>
</HOSP>
</HOSPRELATIONS>
</PROVIDER>
</PROVIDERS>
</PROVIDER_SITE>
</PROVIDER_SITES>
</PROVIDER_GROUP>
<PROVIDER_GROUP>
<PROVIDER_SITES>
<PROVIDER_SITE>
<PROVIDERS>
<!-- MORE PROVIDERS -->
</PROVIDERS>
</PROVIDER_SITE>
</PROVIDER_SITES>
</PROVIDER_GROUP>
我需要一個看起來像這樣的CSV:
PROV_IDENTIFIER | TAXONOMY_CODE
---------------------------------
210985345098 | 234R345359X
310495345091 | 456R345359X
534581039568 | 567R345359X
802869458327 | 234R345359X
這是一個簡單的示例,因此您可以了解如何進行:
from xml.etree import ElementTree as ET
tree = ET.parse('xml/HSP-FullOutOfAreaSite03-DEC.xml')
providers = tree.findall(".//PROVIDERS/PROVIDER")
agg = [
(p.find('./PROV_IDENTIFIER').text,
[t.text for t in p.findall(".//TAXONOMY_CODE")]) for p in providers]
如果對您的XML示例運行此操作,您將獲得
[('3459832385', ['23498R98239X']), ('3945092358', ['55598R98239X'])]
在元組的第一個元素將具有PROV_IDENTIFIER
,第二元件將是所有嵌套的列表TAXONOMY_CODE
元件。
您可以將XML放入bs4
,如下所示:
from bs4 import BeautifulSoup
import pandas as pd
with open('xml/HSP-FullOutOfAreaSite03-DEC.xml', 'r') as f:
soup = BeautifulSoup(f.read(), 'lxml')
# Get the data you want
df = pd.DataFrame(list(zip(
[el.text for el in soup.find_all('prov_identifier')],
[el.text for el in soup.find_all('taxonomy_code')]
)), columns=['PROV_IDENTIFIER', 'TAXONOMY_CODE'])
# Dump to csv
df.to_csv('out.csv', index=False)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.