我认为这很容易,但是由于某些原因,无法在列表中添加字典。覆盖以前的数据。
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"}]
答案 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']}]