%%'', ''%%%%'', etc. sont toutes des balises appartenant à la norme HTML. Il n'est pas prévu que l'on rajoute nos propres balises. En XML c'est différent. XML décrit seulement l'organisation des balises mais nous sommes libres de créer des balises avec les noms que l'on veut, du moment que l'on respecte la forme ''%%...%%'' ou éventuellement ''%%%%''.
==== XML avec Python ====
Dans la plupart des langages, on pourra trouver des bibliothèques de fonctions permettant de gérer facilement les fichiers XML.
En python on pourra utiliser [[https://www.fil.univ-lille1.fr/~marvie/python/chapitre4.html#minidom-il-fait-le-maximum|xml.dom.minidom]] :
import xml.dom.minidom as xml
# si le xml est dans un fichier, par ex flux_rss.xml :
xml_doc = xml.parse('flux_rss.xml')
# si le xml est dans une chaîne de caractère, par ex reponseXML
xml_doc = xml.parseString(reponseXML)
Le document est construit sous forme d'un arbre (//pensez à un arbre généalogique//) : une balise enferme d'autres balises qui sont ses enfants. Une des balise (dans l'exemple la balise ''%%%%'' contient l'ensemble. C'est la **racine**.
root = xml_doc.documentElement # racine
On peut ensuite parcourir les enfants, les enfants des enfants :
# root.getElementByTagName('item') renvoie la liste des noeuds - sous root
for article in root.getElementsByTagName('item'):
# article correspond à un des noeuds
-
titlenode = article.childNodes[0] # premier noeud enfant de article
# dans le flux, l'enfant [0] est toujours un noeud
# donc titlenode est un noeud
textnode = titlenode.childNodes[0]
# titlenode a un unique enfant, c'est un noeud de texte
# textnode est donc le noeud contenant le texte du noeud
- titlenode
print(textNode.data) # par exemple, on affiche le contenu de textnode, c'est à dire le titre
===== Implémentation Python =====
La solution proposée est en 3 parties :
- connexion au flux RSS de France Info (//fait//)
- analyse du contenu du fichier reçu avec XML (//à faire//)
- affichage des titres (//à faire//)
**Remarque :** La plupart des sites sont aujourd'hui en https, c'est à dire chiffrés. Cela occasionne quelques complications. J'ai commenté autant que possible pour que vous compreniez le principe général. Dans tous les cas, gardez à l'esprit que, en fonction des évolutions des technologies, on est obligé de s'adapter. Par exemple, ici, j'ai découvert la bibliothèque python ssl à l'occasion de cet exercice. On a donc besoin de savoir lire des documentations sur internet pour prendre en main ces outils.
# rss.py
# lecture flux RSS
import socket # pour création socket TCP-IP
import ssl # gestion chiffrement pages https
import urllib.request as req
import xml.dom.minidom as xml
def get_xml(url):
"""
url: adresse du flux rss
renvoie le contenu du fichier xml
"""
context = ssl.SSLContext()
with req.urlopen(url, context=context) as reponse:
return reponse.read().decode('utf8')
def get_titles(texte_xml):
'''
texte_xml : le texte XML dans lequel chercher
retourne l'ensemble des titres (contenus dans ...)
sous forme d'une liste.
'''
# à vous !
pass
En ligne 14 j'ai changé l'ancien ''context = ssl.create_default_context()'' qui ne fonctionnait plus pour ''ssl.SSLContext()''. Ce n'est pas idéal car ce choix fait qu'on ne vérifie pas le certificat ssl du site. Cela nous évite les erreurs mais est potentiellement dangereux (les certificats sont là pour la sécurité). Toutefois, dans le cadre de ce TP on échange aucune donnée sensible et on ne risque rien.
# main.py
from rss import get_xml, get_titles
# adresse du flux lui-même
url = 'https://www.francetvinfo.fr/titres.rss'
xml = get_xml(url)
titles = get_titles(xml)
# affiche les 3 premiers titres
print(titles[:3])