¿Cómo implementar python para encontrar valor entre tags xml?

Estoy usando el sitio de Google para recuperar información del clima, quiero encontrar valores entre tags XML. El siguiente código me da las condiciones climáticas de una ciudad, pero no puedo obtener otros parámetros como la temperatura y, si es posible, explicar el funcionamiento de la función de división implícita en el código:

import urllib def getWeather(city): #create google weather api url url = "http://www.google.com/ig/api?weather=" + urllib.quote(city) try: # open google weather api url f = urllib.urlopen(url) except: # if there was an error opening the url, return return "Error opening url" # read contents to a string s = f.read() # extract weather condition data from xml string weather = s.split("<condition data=\"")[-1].split("\"")[0] # if there was an error getting the condition, the city is invalid if weather == "<?xml version=": return "Invalid city" #return the weather condition return weather def main(): while True: city = raw_input("Give me a city: ") weather = getWeather(city) print(weather) if __name__ == "__main__": main() 

Gracias

Bueno, aquí va: una solución de analizador no completa para su caso particular :

 import urllib def getWeather(city): ''' given city name or postal code, return dictionary with current weather conditions ''' url = 'http://www.google.com/ig/api?weather=' try: f = urllib.urlopen(url + urllib.quote(city)) except: return "Error opening url" s = f.read().replace('\r','').replace('\n','') if '')[-1] \ .strip('') wdict = dict(i.split(' data="') for i in weather.split('"/><')) return wdict 

y ejemplo de uso:

 >>> weather = getWeather('94043') >>> weather {'temp_f': '67', 'temp_c': '19', 'humidity': 'Humidity: 61%', 'wind_condition': 'Wind: N at 21 mph', 'condition': 'Sunny', 'icon': '/ig/images/weather/sunny.gif'} >>> weather['humidity'] 'Humidity: 61%' >>> print '%(condition)s\nTemperature %(temp_c)s C (%(temp_f)s F)\n%(humidity)s\n%(wind_condition)s' % weather Sunny Temperature 19 C (67 F) Humidity: 61% Wind: N at 21 mph 

PD. Tenga en cuenta que un cambio bastante trivial en el formato de salida de Google lo interrumpirá, por ejemplo, si agregaran espacios o tabs adicionales entre tags o atributos. Los cuales evitan disminuir el tamaño de la respuesta http. Pero si lo hicieran, tendríamos que familiarizarnos con las expresiones regulares y re.split ()

PPS. La forma en que funciona str.split(sep) se explica en la documentación, aquí hay un extracto: Devuelva una lista de las palabras en la cadena, utilizando sep como la cadena delimitadora. ... El argumento sep puede constar de varios caracteres (por ejemplo, '1 <> 2 <> 3'.split (' <> ') devuelve [' 1 ',' 2 ',' 3 ']) . Entonces 'text1text2text3'.split('') nos da ['text1text2', 'text3'] , luego [0] recoge el primer elemento 'text1text2' , luego dividimos y seleccionamos' text2 'que contiene los datos que nos interesan. Realmente triviales.

UTILIZAR

UNA

Parser

No puede analizar XML usando expresiones regulares, así que no intente. Aquí hay un comienzo para encontrar un analizador XML en Python . Aquí hay un buen sitio para aprender sobre analizar XML en Python .

ACTUALIZACIÓN: Dada la nueva información sobre PyS60, aquí está la documentación para usar XML del sitio web de Nokia.

ACTUALIZACIÓN 2: @Nas Banov ha solicitado un código de muestra, así que aquí está:

 import urllib from xml.parsers import expat def start_element_handler(name, attrs): """ My handler for the event that fires when the parser sees an opening tag in the XML. """ # If we care about more than just the temp data, we can extend this # logic with ``elif``. If the XML gets really hairy, we can create a # ``dict`` of handler functions and index it by tag name, eg, # { 'humidity': humidity_handler } if 'temp_c' == name: print "The current temperature is %(data)s degrees Celsius." % attrs def process_weather_conditions(): """ Main logic of the POC; set up the parser and handle resource cleanup. """ my_parser = expat.ParserCreate() my_parser.StartElementHandler = start_element_handler # I don't know if the S60 supports try/finally, but that's not # the point of the POC. try: f = urllib.urlopen("http://www.google.com/ig/api?weather=30096") my_parser.ParseFile(f) finally: f.close() if __name__ == '__main__': process_weather_conditions() 

Yo sugeriría usar un analizador XML, tal como lo sugirió Hank Gay. Mi sugerencia personal sería lxml , ya que actualmente la estoy usando en un proyecto y extiende la muy útil interfaz de ElementTree ya presente en la biblioteca estándar (xml.etree).

Lxml incluye soporte adicional para xpath, xslt y otras características que faltan en el módulo estándar de ElementTree.

Independientemente de lo que elija, un analizador XML es, con mucho, la mejor opción, ya que podrá tratar el documento XML como un objeto de Python. Esto significa que su código sería algo como:

 # existing code up to... s = f.read() import lxml.etree as ET tree = ET.parse(s) current = tree.find("current_condition/condition") condition_data = current.get("data") weather = condition_data return weather 

XML es datos estructurados. Puede hacerlo mucho mejor que usar la manipulación de cadenas para obtener datos de ella. Existen los módulos sax , dom y elementree en la biblioteca estándar, así como la biblioteca lxml de alta calidad que puede hacer su trabajo por usted de una manera mucho más confiable.