Hemos creado parseXML () función para analizar el archivo XML. Sabemos que XML es un formato de datos intrínsecamente jerárquico y la forma más natural de representarlo es con un árbol. Mire la imagen a continuación, por ejemplo:
Aquí, estamos usando xml.etree.ElementTree (llámelo ET, en resumen) módulo. Element Tree tiene dos clases para este propósito: ElementTree representa todo el XML
documento como un árbol, y Elemento representa un solo nodo en este árbol. Las interacciones con todo el documento (lectura y escritura hacia / desde archivos) generalmente se realizan en el ElementTree nivel. Las interacciones con un solo elemento XML y sus subelementos se realizan en el Elemento nivel.
Ok, repasemos el parseXML () funcionar ahora:
tree = ET.parse(xmlfile)
Aquí, creamos un ElementTree objeto analizando el pasado xmlfile.
root = tree.getroot()
getroot () función devuelve la raíz de árbol como un Elemento objeto.
for item in root.findall('./channel/item'):
Ahora, una vez que haya echado un vistazo a la estructura de su archivo XML, notará que solo estamos interesados en artículo elemento.
./channel/item es en realidad XPath sintaxis (XPath es un lenguaje para abordar partes de un documento XML). Aquí queremos encontrar todos artículo nietos de canal hijos del raíz(denotado por ‘.’) elemento.
Puede leer más sobre la sintaxis XPath compatible aquí.
for item in root.findall('./channel/item'): # empty news dictionary news = {} # iterate child elements of item for child in item: # special checking for namespace object content:media if child.tag == '{http://search.yahoo.com/mrss/}content': news['media'] = child.attrib['url'] else: news[child.tag] = child.text.encode('utf8') # append news dictionary to news items list newsitems.append(news)
Ahora, sabemos que estamos iterando artículo elementos donde cada artículo El elemento contiene una noticia. Entonces, creamos un vacío Noticias diccionario en el que almacenaremos todos los datos disponibles sobre la noticia. Para iterar a través de cada elemento hijo de un elemento, simplemente lo recorremos, así:
for child in item:
Ahora, observe un elemento de elemento de muestra aquí:
Tendremos que manejar las etiquetas de espacio de nombres por separado a medida que se expanden a su valor original, cuando se analizan. Entonces, hacemos algo como esto:
if child.tag == '{http://search.yahoo.com/mrss/}content': news['media'] = child.attrib['url']
child.attrib es un diccionario de todos los atributos relacionados con un elemento. Aquí, estamos interesados en url atributo de Contenido multimedia etiqueta de espacio de nombres.
Ahora, para todos los demás niños, simplemente hacemos:
news[child.tag] = child.text.encode('utf8')
child.tag contiene el nombre del elemento hijo. child.text almacena todo el texto dentro de ese elemento hijo. Entonces, finalmente, un elemento de elemento de muestra se convierte en un diccionario y se ve así:
{'description': 'Ignis has a tough competition already, from Hyun.... , 'guid': 'http://www.hindustantimes.com/autos/maruti-ignis-launch.... , 'link': 'http://www.hindustantimes.com/autos/maruti-ignis-launch.... , 'media': 'http://www.hindustantimes.com/rf/image_size_630x354/HT/... , 'pubDate': 'Thu, 12 Jan 2017 12:33:04 GMT ', 'title': 'Maruti Ignis launches on Jan 13: Five cars that threa..... }
Luego, simplemente agregamos este elemento dict a la lista novedades.
Finalmente, se devuelve esta lista.