将项目从xml附加到字典列表中

时间:2019-07-30 07:39:47

标签: python xml dictionary

我认为这很容易,但是由于某些原因,无法在列表中添加字典。覆盖以前的数据。

for child in data.find_all("item"):
    if "Traffic" in  child.find("name").string:
       self.output["Name"] = child.find("name").string
       self.output["LastValue"] = child.find("lastvalue").string
       self.results.append(self.output)

print(self.results)

以下是输出

data = """
<item>
<name>In</name>
<lastvalue>5,000 MByte</lastvalue>
</item>
<item>
<name>Out</name>
<lastvalue>155 MByte</lastvalue>
</item>
<item>
<name>Total</name>
<lastvalue>5,000 MByte</lastvalue>
</item>

我尝试运行代码,但是它总是打印最后一个项目。 因为它会覆盖以前的数据。

output = [{"Name": "In", "LastValue": "5,000 MByte",
           "Name": "Out", "LastValue": "5,000 MByte",
           "Name": "Total", "LastValue": "5,000 MByte"}]

1 个答案:

答案 0 :(得分:0)

您可以使用zip()函数来压缩<name><lastvalue>中的值。然后使用dict理解:

data = """<item>
<name>In</name>
<lastvalue>5,000 MByte</lastvalue>
</item>
<item>
<name>Out</name>
<lastvalue>155 MByte</lastvalue>
</item>
<item>
<name>Total</name>
<lastvalue>5,000 MByte</lastvalue>
</item>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

results = []
results.append( {name.text: lastvalue.text for name, lastvalue in zip(soup.select('name'), soup.select('lastvalue'))} )

print(results)

打印:

[{'In': '5,000 MByte', 'Out': '155 MByte', 'Total': '5,000 MByte'}]

编辑:如果还有更多<lastvalue>

data = """<item>
<name>In</name>
<lastvalue>5,000 MByte</lastvalue>
</item>
<item>
<name>Out</name>
<lastvalue>155 MByte</lastvalue>
<lastvalue>10,100 MByte</lastvalue>
</item>
<item>
<name>Total</name>
<lastvalue>5,000 MByte</lastvalue>
</item>"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

results = []

for name in soup.select('name'):
    results.append(
        {name.text: [lv.text for lv in name.find_next_siblings('lastvalue')]}
    )

print(results)

打印:

[{'In': ['5,000 MByte']},
 {'Out': ['155 MByte', '10,100 MByte']},
 {'Total': ['5,000 MByte']}]