Em meu último post sobre esse assunto, expliquei porque prefiro, na maioria dos casos, usar um formato de descrição de dados como JSON ao invés de XML. Infelizmente, parece que nem todo mundo concorda comigo, e há uma porção de dados úteis disponíveis apenas em XML. O que não é um problema, certo? Do que eu estou reclamando? Os dados estão lá, disponíveis publicamente, muitos de graça, e eu aqui reclamando do formato?
Vamos dar um jeito e ler XML!
A maneira óbvia parece ser usar um parser de XML, e é o que eu faço na maioria dos casos. Toda linguagem e ambiente de desenvolvimento hoje possuem bons parsers de XML para você escolher. Mas nem sempre o parser de XML é a melhor solução.
Vamos tomar como exemplo o retorno do rssWeather.com:
http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php
A resposta é um RSS com uma tag content:encoded
, contendo uma seção CDATA
com um trecho de HTML. Você vai ter que fazer duplo parsing se quiser as informações de dentro desse HTML. Ou pode adotar uma solução assim:
import urllib2,re url='http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php' xml=urllib2.urlopen(url).read() data=dict(re.findall('<dt.*>(.*)</dt><dd.*> ?(.*)</dd>', xml.replace(':','').replace('°','\xc2\xb0')))
Cinco linhas de código. Dê uma olhada no retorno disso:
>>> data {'Barometer': '1028 mb', 'Wind Speed': '10 KMH', 'Dewpoint': '15\xc2\xb0C', 'Wind Direction': 'SSE (160\xc2\xb0)', 'Visibility': '6 km', 'Humidity': '93%', 'Wind Chill': '15\xc2\xb0C', 'Heat Index': '16\xc2\xb0C'} >>> for i in data.iteritems(): print '%s => %s' % i ... Barometer => 1028 mb Wind Speed => 10 KMH Dewpoint => 15°C Wind Direction => SSE (160°) Visibility => 6 km Humidity => 93% Wind Chill => 15°C Heat Index => 16°C
É importante entender os riscos que estamos assumindo ao adotar essa solução. Se o formato desse HTML for ligeiramente modificado, nosso código pode parar de funcionar. Neste caso, como os dados estão em HTML dentro do XML, isso não é uma desvantagem, porque você teria o mesmo tipo de problema usando um parser SGML.
Será que conseguimos a mesma simplicidade lendo HTML?
import urllib2 url='http://www.bancocentral.gov.br/' html=urllib2.urlopen(url).read() dados=html.replace(',','.').split('')[0].split('\r\n')[-7:] dados=map(float,(dados[0].strip(),dados[3].strip()))
Veja o retorno:
>>> print 'Compra: %.4f, Venda: %.4f' % tuple(dados) Compra: 1.7784, Venda: 1.7792