簡體   English   中英

遍歷XML中的特定子節點並使用Python保存到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM