我收到了一堆 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/