Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从下面的xml中获取每个雇主标签的收入详细信息?_Xml_Python 3.x_Xpath_Beautifulsoup_Xml Parsing - Fatal编程技术网

如何从下面的xml中获取每个雇主标签的收入详细信息?

如何从下面的xml中获取每个雇主标签的收入详细信息?,xml,python-3.x,xpath,beautifulsoup,xml-parsing,Xml,Python 3.x,Xpath,Beautifulsoup,Xml Parsing,我一直在尝试解析一个XML文件(我在下面粘贴了最小可复制代码),并为每个雇主代码的所有收入标签获取年份和收入字段的值。请查看以下输出,以便更好地理解我 我想要得到的是: {"1234": [["2006", "12085"], ["2005","23071"], ["2004","21364"]], "5678" : [["2015", "12345"],["2014", "13071"]]} 我一直试图通过多种方式使用elementtree和/或beautifulsoup来处理该文件,最终只

我一直在尝试解析一个XML文件(我在下面粘贴了最小可复制代码),并为每个雇主代码的所有收入标签获取年份和收入字段的值。请查看以下输出,以便更好地理解我

我想要得到的是:

{"1234": [["2006", "12085"], ["2005","23071"], ["2004","21364"]],
"5678" : [["2015", "12345"],["2014", "13071"]]}
我一直试图通过多种方式使用elementtree和/或beautifulsoup来处理该文件,最终只打印以下内容:

我得到的是:

[["2006", "12085"], ["2005","23071"], ["2004",["2015", "12345"],["2014", "13071"]]
我无法根据他们的雇主代码对他们进行分组

附言:我是一个在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>

1234
ABC服务公司
2006
12085
2005
23071
2004
21364
18700763721
5678
DEF服务公司
2015
12345
2014
13071.73
18700763721

首先重复回答,因为它们包含雇主代码和损益表。然后,它只是把雇主和他们的收入联系起来

xml=''
1234
ABC服务公司
2006
12085
...
...
'''
soup=BeautifulSoup(xml,'html.parser')
雇主={}
对于汤中的res。选择('response'):
emp_code=res.select_one('employeercode')。文本
收入=[]
对于res.select中的收入(“收入”):
年份=收入。选择第一年(“年份”)。文本
总计=收入。选择一个(“总计”)。文本
收入。追加([年度,总额])
雇主[emp_代码]=收入
印刷品(雇主)
输出:

{'1234': [['2006', '12085'], ['2005', '23071'], ['2004', '21364']], '5678': [['2015', '12345'], ['2014', '13071.73']]}
{'1234': [['2006', '12085'], ['2005', '23071'], ['2004', '21364']], '5678': [['2015', '12345'], ['2014', '13071.73']]}

这是此问题的elementtree版本

import xml.etree.ElementTree as ET
tree = ET.parse('_filename_.xml')
root = tree.getroot()
dic ={}
for child in root:
    for schild in child:
        if schild.tag=='EMPLOYER':
            emp=schild[0].text
            dic[emp]=[]
        if schild.tag=='INCOME':
            arr=[]
            arr.append(schild[0].text)
            arr.append(schild[1].text)
            if emp not in dic:
                dic[emp]=arr
            else:
                dic[emp].append(arr)
print(dic)      
输出:

{'1234': [['2006', '12085'], ['2005', '23071'], ['2004', '21364']], '5678': [['2015', '12345'], ['2014', '13071.73']]}
{'1234': [['2006', '12085'], ['2005', '23071'], ['2004', '21364']], '5678': [['2015', '12345'], ['2014', '13071.73']]}

您可以利用dict comprehension和beautifulsou'
get_text()
方法,然后拆分数据。这将产生非常短的代码:

data = '''<DETAILS>
... your data ...
</DETAILS>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')
data = {response.select_one('employercode').text: [i.get_text(strip=True, separator='|').split('|') for i in response.select('income')] for response in soup.select('response')}

from pprint import pprint
pprint(data)

谢谢!这正是我想要的。