nsi:tds:flux_rss
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:tds:flux_rss [2024/04/24 21:33] – goupillwiki | nsi:tds:flux_rss [2024/04/29 14:18] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 9: | Ligne 9: | ||
| Le [[https:// | Le [[https:// | ||
| - | > Syndication ou souscription : système qui consiste à vendre / fournir à plusieurs diffuseurs le droit de reproduire un contenu ou de diffuser un programme. Le diffuseur de contenu est appelé // | + | <WRAP tip> |
| **Imaginons une situation :** | **Imaginons une situation :** | ||
| Ligne 31: | Ligne 31: | ||
| Le fichier obtenu est au format '' | Le fichier obtenu est au format '' | ||
| - | <Code xml linenums> | + | <code xml linenums> |
| <?xml version=" | <?xml version=" | ||
| <rss version=" | <rss version=" | ||
| Ligne 59: | Ligne 59: | ||
| </ | </ | ||
| </ | </ | ||
| - | </Code> | + | </code> |
| - | > Il n'y a que deux articles dans ce flux. Je l'ai abrégé. Le flux original est beaucoup plus long. | + | <WRAP info>Il n'y a que deux articles dans ce flux. Je l'ai abrégé. Le flux original est beaucoup plus long.</ |
| Le format XML est lourd et un peu pénible. C'est un format à **balises** comme HTML. Néanmoins il est très utilisé, c'est bien d'en avoir entendu parler. | Le format XML est lourd et un peu pénible. C'est un format à **balises** comme HTML. Néanmoins il est très utilisé, c'est bien d'en avoir entendu parler. | ||
| Ligne 72: | Ligne 72: | ||
| * À l' | * À l' | ||
| - | > Notez une différence avec HTML : en HTML, les balises '' | + | <WRAP tip> |
| + | Notez une différence avec HTML : en HTML, les balises '' | ||
| + | </ | ||
| ==== XML avec Python ==== | ==== XML avec Python ==== | ||
| Ligne 80: | Ligne 81: | ||
| En python on pourra utiliser [[https:// | En python on pourra utiliser [[https:// | ||
| - | <Code python> | + | <code python> |
| import xml.dom.minidom as xml | import xml.dom.minidom as xml | ||
| # si le xml est dans un fichier, par ex flux_rss.xml : | # si le xml est dans un fichier, par ex flux_rss.xml : | ||
| Ligne 87: | Ligne 88: | ||
| # si le xml est dans une chaîne de caractère, par ex reponseXML | # si le xml est dans une chaîne de caractère, par ex reponseXML | ||
| xml_doc = xml.parseString(reponseXML) | xml_doc = xml.parseString(reponseXML) | ||
| - | </Code> | + | </code> |
| Le document est construit sous forme d'un arbre (//pensez à un arbre généalogique// | Le document est construit sous forme d'un arbre (//pensez à un arbre généalogique// | ||
| - | <Code python> | + | <code python> |
| root = xml_doc.documentElement # racine | root = xml_doc.documentElement # racine | ||
| - | </Code> | + | </code> |
| On peut ensuite parcourir les enfants, les enfants des enfants : | On peut ensuite parcourir les enfants, les enfants des enfants : | ||
| - | <Code python> | + | <code python> |
| + | # root.getElementByTagName(' | ||
| for article in root.getElementsByTagName(' | for article in root.getElementsByTagName(' | ||
| - | # article correspond à un noeud < | + | # article correspond à un des noeuds |
| - | | + | |
| - | print(child0.data ) # contenu | + | # dans le flux, l' |
| - | </Code> | + | # 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 < | ||
| + | print(textNode.data) # par exemple, on affiche le contenu | ||
| + | </code> | ||
| ===== Implémentation Python ===== | ===== Implémentation Python ===== | ||
| Ligne 111: | Ligne 118: | ||
| - affichage des titres (//à faire//) | - affichage des titres (//à faire//) | ||
| - | > **Remarque :** La plupart des sites sont aujourd' | + | <WRAP tip> |
| - | + | <code python linenums> | |
| - | <Code python linenums> | + | # rss.py |
| # lecture flux RSS | # lecture flux RSS | ||
| import socket | import socket | ||
| import ssl # gestion chiffrement pages https | import ssl # gestion chiffrement pages https | ||
| - | + | import urllib.request | |
| - | # le flux qui nous sert d' | + | |
| - | # on donne l' | + | |
| - | hostname = ' | + | |
| - | + | ||
| - | # adresse du flux lui-même | + | |
| - | address = ' | + | |
| - | + | ||
| - | # création d'un contexte sécurisé avec ssl | + | |
| - | context = ssl.SSLContext() | + | |
| - | + | ||
| - | HTTP_VERSION = 1.0 | + | |
| - | CRLF = " | + | |
| - | + | ||
| - | # Dans certains cas on utilise une ressource. Il faut demander au système d' | + | |
| - | # de nous donner accès à cette ressource puis il faut lui dire quand on libère cette ressource. | + | |
| - | # ex : ouverture / fermeture de fichier ; ouverture / fermeture de connexion | + | |
| - | # avec le mot clé with, on crée un bloc qui réserve la ressource | + | |
| - | # puis la libère dès qu'on sort du bloc. | + | |
| - | + | ||
| - | # 443 est le port habituel pour https | + | |
| - | with socket.create_connection((hostname, | + | |
| - | # sock est " | + | |
| - | with context.wrap_socket(sock, | + | |
| - | # lancement la requête GET en précisant l' | + | |
| - | ssock.send(" | + | |
| - | # la taille de la réponse est inconnue. | + | |
| - | # on réceptionne par morceaux de 1024 octets. | + | |
| - | reponseXML = "" | + | |
| - | + | ||
| - | while True: | + | |
| - | block = ssock.recv(1024) | + | |
| - | if not block: | + | |
| - | # block est vide, il n'y a plus rien à récupérer | + | |
| - | # sortie de la boucle | + | |
| - | break | + | |
| - | + | ||
| - | # À l' | + | |
| - | # le bloc qui suit consiste à tenter (try) un décodage en utf-8 | + | |
| - | # et si cette tentative provoque une erreur, | + | |
| - | # recommencer mais avec un décodage en iso | + | |
| - | try: | + | |
| - | reponseXML += block.decode(" | + | |
| - | except: | + | |
| - | reponseXML += block.decode(" | + | |
| - | + | ||
| - | # arrivé à ce point, reponseXML contient le texte de réponse. | + | |
| - | # chargement de la bibliothèque xml | + | |
| import xml.dom.minidom as xml | import xml.dom.minidom as xml | ||
| - | # votre travail | + | def get_xml(url): |
| - | def getTitles(texteXml): | + | """ |
| + | url: adresse du flux rss | ||
| + | renvoie le contenu du fichier xml | ||
| + | """ | ||
| + | context = ssl.SSLContext() | ||
| + | with req.urlopen(url, | ||
| + | return reponse.read().decode(' | ||
| + | | ||
| + | def get_titles(texte_xml): | ||
| ''' | ''' | ||
| - | | + | |
| retourne l' | retourne l' | ||
| sous forme d'une liste. | sous forme d'une liste. | ||
| Ligne 178: | Ligne 146: | ||
| # à vous ! | # à vous ! | ||
| pass | pass | ||
| - | + | </code> | |
| - | # Et pour finir, utilisez la fonction getTitles pour obtenir les titres | + | |
| - | # et affichez-les. | + | |
| - | </Code> | + | |
| <WRAP important> | <WRAP important> | ||
| - | <WRAP tip>Tout le bloc des lignes 1 à 49 permet de comprendre le principe de l' | + | <code python linenums> |
| + | # main.py | ||
| - | <code python linenums> | + | from rss import |
| - | import | + | |
| - | import urllib.request as req | + | # adresse du flux lui-même |
| - | url = "https:// | + | url = 'https:// |
| - | context | + | |
| - | reponseXML | + | xml = get_xml(url) |
| + | titles | ||
| + | |||
| + | # affiche les 3 premiers titres | ||
| + | print(titles[:3]) | ||
| </ | </ | ||
| - | </ | ||
nsi/tds/flux_rss.1713987208.txt.gz · Dernière modification : de goupillwiki
