从python

时间:2016-12-29 16:04:59

标签: python xml matplotlib

我试图从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。

我知道可能有一种简单的方法可以修复它,任何想法都会很棒,你们这里的人们在学习编码方面帮助了我很多。感谢

2 个答案:

答案 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')