Python 将 xml 解析为数据帧,无需明确命名标签

标签 python xml pandas

我收到了一堆 XML 文件,但是标签没有不同的名称,相反,所有记录标签都以而不是开头名称结尾。它看起来像这样:

<?xml version='1.0'  encoding='UTF-8' ?>
<RESULTS>
    <ROW>
        <COLUMN NAME="CASE_KEY"><![CDATA[1248999]]></COLUMN>
        <COLUMN NAME="CASE_DESCRIPTION">[CDATA[MANUAL-GP-[][][02]01 JUL</COLUMN>
        <COLUMN NAME="CASE_NARRATIVE"> doing my narrative</COLUMN>
    </ROW>
    <ROW>
        <COLUMN NAME="CASE_KEY"><![CDATA[1248998]]></COLUMN>
        <COLUMN NAME="CASE_DESCRIPTION">[CDATA[MANUAL-GP-[][][02]01 AUG</COLUMN>
        <COLUMN NAME="CASE_NARRATIVE">another narative stuff</COLUMN>
    </ROW>
</RESULTS>

所以你可以看到根是 ,并且每个 RECORD 都被命名为 。我可以一起工作。每个嵌入的标签都以 while 结尾,我认为这搞砸了我的代码。这是我得到的:

import xml.etree.cElementTree as et
import pandas as pd

def getvalueofnode(node):
    """ return node text or None """
    return node.text if node is not None else None


def main():
    """ main """
    parsed_xml = et.parse("Load.xml")
    dfcols = ['ROW','CASE_KEY','CASE_DESCRIPTION','CASE_NARRATIVE']
    df_xml = pd.DataFrame(columns=dfcols)

    for node in parsed_xml.getroot():
        ROW = node.attrib.get('ROW')
        CASE_KEY = node.find('CASE_KEY')
        CASE_DESCRIPTION = node.find('CASE_DESCRIPTION')
        CASE_NARRATIVE = node.find('CASE_NARRATIVE')

        df_xml = df_xml.append(
            pd.Series([ROW, getvalueofnode(CASE_KEY), getvalueofnode(CASE_DESCRIPTION),
                       getvalueofnode(CASE_NARRATIVE)], index=dfcols),
            ignore_index=True)

    print(df_xml)

main()

这是我运行的输出:

\c:\python\MonitorScripts\xmlcleaner\NewXML\Alerts>"c:\python\MonitorScripts\xmlcleaner\xmlc.py"
    ROW CASE_KEY CASE_DESCRIPTION CASE_NARRATIVE
0  None     None             None           None

我猜是那些奇怪命名的标签让我困惑,但是我无法选择将它们更改为格式正确的标签。

有什么建议吗?

最佳答案

我在 bs4 中使用了 attribute = value css 选择器

from bs4 import BeautifulSoup
import pandas as pd
doc = """
<?xml version='1.0'  encoding='UTF-8' ?>
<RESULTS>
    <ROW>
        <COLUMN NAME="CASE_KEY"><![CDATA[1248999]]></COLUMN>
        <COLUMN NAME="CASE_DESCRIPTION">[CDATA[MANUAL-GP-[][][02]01 JUL</COLUMN>
        <COLUMN NAME="CASE_NARRATIVE"> doing my narrative</COLUMN>
    </ROW>
    <ROW>
        <COLUMN NAME="CASE_KEY"><![CDATA[1248998]]></COLUMN>
        <COLUMN NAME="CASE_DESCRIPTION">[CDATA[MANUAL-GP-[][][02]01 AUG</COLUMN>
        <COLUMN NAME="CASE_NARRATIVE">another narative stuff</COLUMN>
    </ROW>
</RESULTS>
"""

soup = BeautifulSoup(doc, 'html.parser')

caseKeys = [case.text for case in soup.select('[name="CASE_KEY"]')]
caseDescriptions = [case.text for case in soup.select('[name="CASE_DESCRIPTION"]')]
caseNarratives = [case.text for case in soup.select('[name="CASE_NARRATIVE"]')]
results = list(zip(caseKeys, caseDescriptions, caseNarratives))
df = pd.DataFrame(results,columns = ['CaseKey','CaseDescription','CaseNarrative'])
print(df)

关于Python 将 xml 解析为数据帧,无需明确命名标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53858436/

相关文章:

Python etree XSLT 需要标签输出吗?

java - 将 python 转换为 java float 与 double

xml - Azure部署: error MSB4041: The default XML namespace of the project must be the MSBuild XML namespace

python - python Pandas/numpy 的 R 的 match() 等价物是什么?

python - 根据 Python pandas 中的索引补集挑选元素

python - SciTE -1073741819中的Python退出代码

python - 除每个列表的第一个值之外的嵌套列表行的总和

xml - 如何使用 Omni XML 中的命名空间来使用 XML SelectNodes()

mysql - 将列名映射到字段名 LOAD XML LOCAL INFILE

python - 在多个 python pandas 数据帧中查找记录