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 [2023/05/26 06:36] – ↷ Liens modifiés en raison d'un déplacement. 40.77.167.146 | 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é syndicate. | + | <WRAP tip> |
| - | Imaginons une situation : | + | **Imaginons une situation :** |
| - | * A est un site produisant podcasts (par exemple '' | + | * A est un site produisant |
| * B est une application sur téléphone qui permet de s' | * B est une application sur téléphone qui permet de s' | ||
| Ligne 21: | Ligne 21: | ||
| Comme ce fichier RSS se remplit et se vide tout seul à mesure que les nouveaux podcasts sont créés puis deviennent périmés, on parle de flux. C'est donc un flux RSS. | Comme ce fichier RSS se remplit et se vide tout seul à mesure que les nouveaux podcasts sont créés puis deviennent périmés, on parle de flux. C'est donc un flux RSS. | ||
| - | //Bien sûr, j'ai parlé de podcasts, mais tout ce qui a été dit est valable pour n' | + | <WRAP tip> |
| + | Bien sûr, j'ai parlé de podcasts, mais tout ce qui a été dit est valable pour n' | ||
| + | </WRAP> | ||
| ===== Format du flux RSS ===== | ===== Format du flux RSS ===== | ||
| Ligne 29: | 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 57: | 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 | + | 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 |
| Quelques exemples ici dans ce fichier : | Quelques exemples ici dans ce fichier : | ||
| Ligne 70: | 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 78: | 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 85: | 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 109: | 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 176: | 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> | <code python linenums> | ||
| - | import ssl | + | # main.py |
| - | import | + | |
| - | url = "https:// | + | from rss import |
| - | context | + | |
| - | reponseXML | + | # adresse du flux lui-même |
| + | url = 'https:// | ||
| + | |||
| + | xml = get_xml(url) | ||
| + | titles | ||
| + | |||
| + | # affiche les 3 premiers titres | ||
| + | print(titles[:3]) | ||
| </ | </ | ||
| - | </ | ||
nsi/tds/flux_rss.1685075783.txt.gz · Dernière modification : de 40.77.167.146
