xml - 如何从以下 xml 中获取每个雇主标签的收入详细信息?
问题描述
我一直在尝试解析一个 XML 文件(我在下面粘贴了最小的可重现代码)并获取每个雇主代码的所有收入标签的年份和收入字段的值。请查看以下输出,以便您更好地理解我
我想要得到什么:
{"1234": [["2006", "12085"], ["2005","23071"], ["2004","21364"]],
"5678" : [["2015", "12345"],["2014", "13071"]]}
我一直在尝试使用 elementtree 和/或 beautifulsoup 以多种方式干预文件,最终只打印这个:
我实际得到的:
[["2006", "12085"], ["2005","23071"], ["2004",["2015", "12345"],["2014", "13071"]]
我无法根据他们的雇主代码对他们进行分组。
PS:我是在 Stackoverflow 上发布问题的新手。我希望我符合所有社区准则。这是吞噬我大脑的 XML:
<DETAILS>
<RESPONSE>
<EMPLOYER>
<EMPLOYERCODE>1234</EMPLOYERCODE>
<NAME1>ABC Service Corporation</NAME1>
</EMPLOYER>
<INCOME>
<YEAR>2006</YEAR>
<TOTAL>12085</TOTAL>
</INCOME>
<INCOME>
<YEAR>2005</YEAR>
<TOTAL>23071</TOTAL>
</INCOME>
<INCOME>
<YEAR>2004</YEAR>
<TOTAL>21364</TOTAL>
</INCOME>
<ID>18700763721</ID>
</RESPONSE>
<RESPONSE>
<EMPLOYER>
<EMPLOYERCODE>5678</EMPLOYERCODE>
<NAME1>DEF Service Corporation</NAME1>
</EMPLOYER>
<INCOME>
<YEAR>2015</YEAR>
<TOTAL>12345</TOTAL>
</INCOME>
<INCOME>
<YEAR>2014</YEAR>
<TOTAL>13071.73</TOTAL>
</INCOME>
<ID>18700763721</ID>
</RESPONSE>
</DETAILS>
解决方案
首先迭代响应,因为它们包含雇主代码和损益表。然后它只是将雇主与他们的收入联系起来。
xml = '''
<DETAILS>
<RESPONSE>
<EMPLOYER>
<EMPLOYERCODE>1234</EMPLOYERCODE>
<NAME1>ABC Service Corporation</NAME1>
</EMPLOYER>
<INCOME>
<YEAR>2006</YEAR>
<TOTAL>12085</TOTAL>
</INCOME>
...
</RESPONSE>
<RESPONSE>
...
</RESPONSE>
</DETAILS>
'''
soup = BeautifulSoup(xml, 'html.parser')
employers = {}
for res in soup.select('response'):
emp_code = res.select_one('employercode').text
incomes = []
for income in res.select('income'):
year = income.select_one('year').text
total = income.select_one('total').text
incomes.append([year, total])
employers[emp_code] = incomes
print(employers)
输出:
{'1234': [['2006', '12085'], ['2005', '23071'], ['2004', '21364']], '5678': [['2015', '12345'], ['2014', '13071.73']]}