我试图从XML文件中获取2个不同的元素,我试图在散点图上将它们打印为x和y,我可以设法获得这两个元素,但是当我绘制时它们只使用其中一个日期来绘制其他元素。我使用以下代码获取天气HTML并将其另存为XML。
url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=52.41616;lon=-4.064598"
response = requests.get(url)
xml_text=response.text
weather= bs4.BeautifulSoup(xml_text, "xml")
f = open('file.xml', "w")
f.write(weather.prettify())
f.close()
然后我尝试获取时间('来自')元素和(' windSpeed'>' mps')元素和属性。然后我尝试在散点图上将其绘制为x和y。
with open ('file.xml') as file:
soup = bs4.BeautifulSoup(file, "xml")
times = soup.find_all("time")
windspeed = soup.select("windSpeed")
form = ("%Y-%m-%dT%H:%M:%SZ")
x = []
y = []
for element in times:
time = element.get("from")
t = datetime.datetime.strptime(time, form)
x.append(t)
for mps in windspeed:
speed = mps.get("mps")
y.append(speed)
plt.scatter(x, y)
plt.show()
我试图从2个循环中创建2个列表,然后将它们作为x和y读取,但是当我运行它时会出现错误; 提高ValueError(" x和y必须大小相同") ValueError:x和y必须大小相同
我假设它是因为它将列表打印为datetime.datetime(2016,12,22,21,0),如何从列表中删除datetime.datetime。
我知道可能有一种简单的方法可以修复它,任何想法都会很棒,你们这里的人们在学习编码方面帮助了我很多。感谢
答案 0 :(得分:0)
只需制作两个包含x轴值的列表和一个包含y轴值的列表并传递给散点函数
plt.scatter(list1,list2);
答案 1 :(得分:0)
我建议您使用 lxml 来分析xml,因为它使您能够使用xpath表达式,这可以使生活更轻松。在这种情况下,并非每次条目都包含windSpeed条目;因此,首先识别windSpeed条目然后获得相关时间是必不可少的。这段代码就是这样。我经常遇到两个小问题:(1)我仍然需要玩#39;使用xpath使其正确; (2)有时我会得到一个列表,当我期望单身,这就是为什么有一个' [0]'在代码中。我觉得以交互方式构建代码会更好。
>>> from lxml import etree
>>> XML = open('file.xml')
>>> tree = etree.parse(XML)
>>> for count, windSpeeds in enumerate(tree.xpath('//windSpeed')):
... windSpeeds.attrib['mps'], windSpeeds.xpath('../..')[0].attrib['from']
... if count>5:
... break
...
('3.9', '2016-12-29T18:00:00Z')
('4.8', '2016-12-29T21:00:00Z')
('5.0', '2016-12-30T00:00:00Z')
('4.5', '2016-12-30T03:00:00Z')
('4.1', '2016-12-30T06:00:00Z')
('3.8', '2016-12-30T09:00:00Z')
('4.4', '2016-12-30T12:00:00Z')