<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://curlybraces.be/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leo+Ouzegdouh</id>
	<title>{} - Contributions de l’utilisateur [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://curlybraces.be/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Leo+Ouzegdouh"/>
	<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/Sp%C3%A9cial:Contributions/Leo_Ouzegdouh"/>
	<updated>2026-05-11T00:10:06Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.35.10</generator>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=5088</id>
		<title>Léo</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=5088"/>
		<updated>2021-04-26T16:22:58Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par lieu ainsi que par date. Etant très intéressé par l&amp;#039;urbanisme ainsi que par l&amp;#039;histoire, j&amp;#039;ai une grande curiosité pour ces vieilles cartes, et j&amp;#039;en consulte régulièrement. Je serai peut-être amené à en utiliser dans un projet artistique futur.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;SOURCES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
- https://www.geographicus.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.oldmapsonline.org/&lt;br /&gt;
&lt;br /&gt;
- https://commons.wikimedia.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.discusmedia.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.mapsofthepast.com/&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;STRUCTURE&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Structure.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;AVANCEMENT DU PREMIER QUADRI&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Mon projet a un peu évolué au cours du premier quadri. Je ne cherche plus uniquement des cartes de Paris et de Bruxelles, mais d&amp;#039;un maximum de villes différentes. Mon objectif final est d&amp;#039;avoir suffisamment de matière pour m&amp;#039;initier au machine learning. J&amp;#039;ai une vague première idée, celle d&amp;#039;un générateur automatique de cartes. Je n&amp;#039;ai aucune connaissance en machine learning, alors je verrai ce qu&amp;#039;il en sera à ce moment-là. Pour l&amp;#039;instant, je veux accumuler un maximum de données. L&amp;#039;idée sera alors d&amp;#039;exporter les images de chaque carte, avec un nom &amp;quot;ordonné&amp;quot; : ville-siècle.extension. Par exemple, Bruxelles-17.jpeg. Ensuite, je souhaite classer ces images pour les retrouver plus rapidement, en autant de sous-dossiers que possible. Par exemple, &amp;quot;Europe → Belgique → Flandre → Gand-15.png&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai réussi assez simplement à récupérer les infos qui m&amp;#039;intéressaient sur certains de mes sites sources (geographicus et mapsofthepast). Un problème auquel j&amp;#039;ai été confronté, fut de rendre l&amp;#039;information propre. Par exemple, lorsque je récupérais le titre de la carte, il y avait beaucoup d&amp;#039;infos inutiles. Comment, en partant de &amp;quot;Map of Brussels, from the royal archives&amp;quot;, réussir à obtenir &amp;quot;Bruxelles&amp;quot; ?&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai dû coder un petit bout de programme qui me permettait, premièrement, de nettoyer la phrase de tous les caractères inutiles comme les virgules, parenthèses, etc.&lt;br /&gt;
&lt;br /&gt;
Ensuite, le programme me permettait d&amp;#039;isoler chaque mot, afin qu&amp;#039;il soit lu séparément. J&amp;#039;utilisais alors la librairie &amp;quot;Geonamescache&amp;quot; pour identifier les noms de villes parmi les mots. Une fois ceux-ci trouvés et les mots inutiles enlevés, j&amp;#039;utilisais la bibliothèque deep_translator pour automatiquement détecter la langue dans laquelle le nom de la ville était écrit, puis pour le traduire en français.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;OBJECTIFS DU SECOND QUADRI&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Mon premier objectif à court terme sera d&amp;#039;améliorer ce que j&amp;#039;ai déjà fait. J&amp;#039;ai deux problèmes principaux : &lt;br /&gt;
&lt;br /&gt;
1 - Mon code est vraiment dégueulasse, c&amp;#039;est en grande partie pour ça que je ne le poste pas ici. J&amp;#039;apprends peu à peu le python, et me rends compte que je peux faire un code bien plus propre et compréhensible, notamment en utilisant des fonctions au lieu de recopier le même code à chaque fois. Je veux donc reprendre ce que j&amp;#039;ai fait, et le rendre plus compréhensible, car sinon je vais vite me perdre.&lt;br /&gt;
&lt;br /&gt;
2 - En passant par la bibliothèque deep_translator, j&amp;#039;utilise un plugin google trad pour traduire les noms des villes. Problème : j&amp;#039;ai un nombre de requêtes (très) limité. Quand on les dépasse, le programme plante. Impossible de compter là-dessus pour la suite, alors je dois trouver une autre alternative. J&amp;#039;ai besoin de pouvoir détecter la langue automatiquement car il y en a de toutes sortes dans les noms des cartes, et aussi de traduire automatiquement. Je vais réfléchir à une solution dans ces prochaines semaines.&lt;br /&gt;
&lt;br /&gt;
Une fois que j&amp;#039;aurai fait ça, je pourrai me pencher sur la suite. En vrac :&lt;br /&gt;
&lt;br /&gt;
- Adapter mon code à tous mes sites&lt;br /&gt;
- Extraire les images&lt;br /&gt;
- Trouver comment automatiquement les renommer&lt;br /&gt;
- Trouver comment automatiquement les ranger&lt;br /&gt;
- Commencer à regarder le machine learning de plus près&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;AVANCEMENT DU SECOND QUADRI&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai réussi à bien avancer à partir du site Geographicus, à avoir l&amp;#039;accès à toutes les cartes qui m&amp;#039;intéressent depuis la page d&amp;#039;accueil du site. J&amp;#039;ai eu beaucoup de soucis pour les enregistrer, mais j&amp;#039;ai presque fini par réussir, il faudrait juste que j&amp;#039;ajoute un bypass pour éviter que le programme ne plante quand il y a une erreur 404. Si j&amp;#039;avais eu plus de temps, j&amp;#039;aurais aussi rendu l&amp;#039;enregistrement du nom de fichiers plus propre, et je les aurais classés par continent comme je comptais le faire. Voici le code en intégral :&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
import geonamescache&lt;br /&gt;
&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
numFichier = 1&lt;br /&gt;
tousLesLiensImages = []&lt;br /&gt;
&lt;br /&gt;
listeLiens = []&lt;br /&gt;
parcourirListeLiens = 0    # listeLiens contient tous les liens des catégories (Asian Maps, Europe maps, etc.) et parcourirListeLiens permet de parcourir cette liste&lt;br /&gt;
&lt;br /&gt;
listeVraisLiens = []&lt;br /&gt;
parcourirListeVraisLiens = 0    # listeVraisLiens contient tous les liens des cartes dans chaque catégorie, et parcourirListeVraisLiens permet de parcourir cette liste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.geographicus.com/P/RareMaps/city-maps-plans&amp;#039;, timeout=50.0)&lt;br /&gt;
&lt;br /&gt;
##data = br.open(&amp;#039;https://www.geographicus.com/P/AntiqueMap/kremlenagrad-gerritsz-1642&amp;#039;, timeout=50.0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;blockquote a&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for selecteur in selecteurs:&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        lienCategorie = resultat.get(&amp;#039;href&amp;#039;)&lt;br /&gt;
        lienListe = lienCategorie.split(&amp;quot;&amp;amp;&amp;quot;)&lt;br /&gt;
        del lienListe[-1]&lt;br /&gt;
        lienListe.append(&amp;quot;&amp;amp;Sort_By=price_desc&amp;amp;Per_Page=-1&amp;quot;)&lt;br /&gt;
        vraiLien = &amp;quot;&amp;quot;.join(lienListe)&lt;br /&gt;
        listeLiens.append(vraiLien)&lt;br /&gt;
&lt;br /&gt;
for loop in range(len(listeLiens)):&lt;br /&gt;
&lt;br /&gt;
    data = br.open(listeLiens[parcourirListeLiens], timeout=50.0)&lt;br /&gt;
    rawdata = data.read()&lt;br /&gt;
    unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
    src = lh.fromstring(unicode)&lt;br /&gt;
    selecteurs = cssselect.parse(&amp;#039;.column.half.medium-one-fourth.category-product a&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    for selecteur in selecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
        resultats = src.xpath(chemin_xpath)&lt;br /&gt;
        for resultat in resultats:&lt;br /&gt;
            listeVraisLiens.append(resultat.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
    parcourirListeLiens += 1&lt;br /&gt;
&lt;br /&gt;
for loop in range(len(listeVraisLiens)):&lt;br /&gt;
&lt;br /&gt;
    data = br.open(listeVraisLiens[parcourirListeVraisLiens], timeout=50.0)&lt;br /&gt;
    rawdata = data.read()&lt;br /&gt;
    unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
    src = lh.fromstring(unicode)&lt;br /&gt;
    selecteurs = (cssselect.parse(&amp;#039;.normal.oldbeige.nm&amp;#039;))&lt;br /&gt;
    selecteursImages = (cssselect.parse(&amp;#039;.m-img-z&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
    for selecteur in selecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
        resultats = src.xpath(chemin_xpath)&lt;br /&gt;
        for resultat in resultats:&lt;br /&gt;
            nomCarte = resultat.text_content()&lt;br /&gt;
            if nomCarte.find(&amp;quot;map&amp;quot;) != -1 or nomCarte.find(&amp;quot;Map&amp;quot;) != -1 or nomCarte.find(&amp;quot;plan&amp;quot;) != -1 or nomCarte.find(&amp;quot;Plan&amp;quot;) != -1 :&lt;br /&gt;
                quasiLigneSansAs = nomCarte.replace(&amp;quot; as &amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
                ligneSansAs = quasiLigneSansAs.replace(&amp;quot;/&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                espacesBrut = &amp;quot;&amp;quot;&lt;br /&gt;
                espacesFinaux = &amp;quot;&amp;quot;&lt;br /&gt;
                parcourirEspaces = 0&lt;br /&gt;
                gc = geonamescache.GeonamesCache()&lt;br /&gt;
                parcourirMots = 0&lt;br /&gt;
&lt;br /&gt;
                listeLigneSansAs = ligneSansAs.split(&amp;quot; &amp;quot;)&lt;br /&gt;
                dateCarte = listeLigneSansAs[0]&lt;br /&gt;
                del listeLigneSansAs[0]&lt;br /&gt;
                places = &amp;quot; &amp;quot;.join(listeLigneSansAs)&lt;br /&gt;
                nomDeLieu = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                for loop in range(len(places)):&lt;br /&gt;
                	for char in places:&lt;br /&gt;
                		if(ord(char) == 39 or ord(char) == 45):&lt;br /&gt;
                			espacesBrut = espacesBrut + &amp;quot;?? ??&amp;quot; + char&lt;br /&gt;
                		if((ord(char) &amp;gt;= 97 and ord(char) &amp;lt;= 122) or (ord(char) &amp;gt;= 65 and ord(char) &amp;lt;= 90) or (ord(char) &amp;gt;= 192 and ord(char) &amp;lt;= 255 and ord(char) != 215 and ord(char) != 247) or (ord(char) == 32)):&lt;br /&gt;
                			espacesBrut += char&lt;br /&gt;
                		places = places[1:]&lt;br /&gt;
&lt;br /&gt;
                for loop in range(len(espacesBrut)):&lt;br /&gt;
                	for char in espacesBrut:&lt;br /&gt;
                		if((ord(char) &amp;gt;= 97 and ord(char) &amp;lt;= 122) or (ord(char) &amp;gt;= 65 and ord(char) &amp;lt;= 90) or (ord(char) &amp;gt;= 192 and ord(char) &amp;lt;= 255 and ord(char) != 215 and ord(char) != 247) or (ord(char) == 32)):&lt;br /&gt;
                			espacesFinaux += char&lt;br /&gt;
                		espacesBrut = espacesBrut[1:]&lt;br /&gt;
&lt;br /&gt;
                espaces = espacesFinaux.split(&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                while len(espaces) &amp;gt; 0:&lt;br /&gt;
                	if len(espaces)-3 &amp;gt;= espaces.index(espaces[parcourirEspaces]):&lt;br /&gt;
                		resultat = espaces[parcourirEspaces]+&amp;quot; &amp;quot;+espaces[parcourirEspaces+1]+&amp;quot; &amp;quot;+espaces[parcourirEspaces+2]&lt;br /&gt;
                		villes = gc.search_cities(resultat)&lt;br /&gt;
                		if villes != []:&lt;br /&gt;
                			villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                			if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                				nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                		else :&lt;br /&gt;
                			if len(espaces)-2 &amp;gt;= espaces.index(espaces[parcourirEspaces]):&lt;br /&gt;
                				resultat = espaces[parcourirEspaces]+&amp;quot; &amp;quot;+espaces[parcourirEspaces+1]&lt;br /&gt;
                				villes = gc.search_cities(resultat)&lt;br /&gt;
                				if villes != []:&lt;br /&gt;
                					villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                					if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                						nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
                					del espaces[parcourirEspaces]&lt;br /&gt;
                					del espaces[parcourirEspaces]&lt;br /&gt;
                				else :&lt;br /&gt;
                					villes = gc.search_cities(espaces[parcourirEspaces])&lt;br /&gt;
                					if villes != []:&lt;br /&gt;
                						villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                						if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                							nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
                						del espaces[parcourirEspaces]&lt;br /&gt;
                					else :&lt;br /&gt;
                						del espaces[parcourirEspaces]&lt;br /&gt;
&lt;br /&gt;
                	elif len(espaces)-2 &amp;gt;= espaces.index(espaces[parcourirEspaces]):&lt;br /&gt;
                		resultat = espaces[parcourirEspaces]+&amp;quot; &amp;quot;+espaces[parcourirEspaces+1]&lt;br /&gt;
                		villes = gc.search_cities(resultat)&lt;br /&gt;
                		if villes != []:&lt;br /&gt;
                			villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                			if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                				nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                		else :&lt;br /&gt;
                			villes = gc.search_cities(espaces[parcourirEspaces])&lt;br /&gt;
                			if villes != []:&lt;br /&gt;
                				villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                				if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                					nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
                				del espaces[parcourirEspaces]&lt;br /&gt;
                			else :&lt;br /&gt;
                				del espaces[parcourirEspaces]&lt;br /&gt;
&lt;br /&gt;
                	else :&lt;br /&gt;
                		villes = gc.search_cities(espaces[parcourirEspaces])&lt;br /&gt;
                		if villes != []:&lt;br /&gt;
                			villeFinal = villes[0].get(&amp;#039;name&amp;#039;)&lt;br /&gt;
                			if villeFinal != &amp;#039;Fier-Çifçi&amp;#039; :&lt;br /&gt;
                				nomDeLieu += villeFinal + &amp;quot; &amp;quot;&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                		else :&lt;br /&gt;
                			del espaces[parcourirEspaces]&lt;br /&gt;
                print(nomDeLieu)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                for selecteur in selecteursImages:&lt;br /&gt;
                    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
                    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
                    for resultat in resultats:&lt;br /&gt;
&lt;br /&gt;
                        lienImage = resultat.get(&amp;#039;src&amp;#039;)&lt;br /&gt;
                        if lienImage not in tousLesLiensImages :&lt;br /&gt;
                            tousLesLiensImages.append(lienImage)&lt;br /&gt;
                            lienImageListe = lienImage.split(&amp;quot;.&amp;quot;)&lt;br /&gt;
                            extensionImage = lienImageListe[-1]&lt;br /&gt;
                            nomSauvegarde = nomDeLieu + dateCarte +&amp;quot;.&amp;quot;+extensionImage&lt;br /&gt;
                            print (lienImage)&lt;br /&gt;
                            if Path(nomSauvegarde).is_file():&lt;br /&gt;
                                nomSauvegarde = nomDeLieu + dateCarte+&amp;quot;_&amp;quot;+ str(numFichier) +&amp;quot;.&amp;quot;+extensionImage&lt;br /&gt;
                                numFichier += 1&lt;br /&gt;
                            data = br.open(lienImage).read()&lt;br /&gt;
                            if data == True :&lt;br /&gt;
                                save = open(nomSauvegarde, &amp;#039;wb&amp;#039;)&lt;br /&gt;
                                save.write(data)&lt;br /&gt;
                                save.close()&lt;br /&gt;
    parcourirListeVraisLiens += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;BILAN ET IDEES FUTURES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai beaucoup appris cette année, et j&amp;#039;ai très envie de continuer. Pour l&amp;#039;avenir, je voudrais achever de corriger les bugs qui restent, notamment de pouvoir bypasser les erreurs 404, enregistrer les noms plus proprement et mieux les classer.&lt;br /&gt;
Ensuite, je voudrais les enregistrer dans la base de donnée, et adapter ce système aux autres sélecteurs.&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=ERG::Code-2020-2&amp;diff=4755</id>
		<title>ERG::Code-2020-2</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=ERG::Code-2020-2&amp;diff=4755"/>
		<updated>2021-02-11T10:59:31Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : /* 11 février 2021 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Ce cours est destiné aux étudiant.e.s de BAC3. Cette année, nous nous concentrons sur les bases de données, définies comme &amp;quot;une collection structurée d&amp;#039;éléments sur laquelle l&amp;#039;utilisateur.trice peut effectuer une série d&amp;#039;opérations: voir, naviguer, chercher&amp;quot; (Lev Manovich, &amp;#039;&amp;#039;Le langage des Nouveaux Médias&amp;#039;&amp;#039;). &lt;br /&gt;
&lt;br /&gt;
==Sessions==&lt;br /&gt;
===11 février 2021===&lt;br /&gt;
&lt;br /&gt;
Liste des sources: sites d&amp;#039;actualités, Suisse Romande&lt;br /&gt;
* 24 heures (Canton de Vaud)&lt;br /&gt;
* Tribune de Genève (Canton de Genève)&lt;br /&gt;
* Le Temps (Canton de Genève)&lt;br /&gt;
* La Liberté (Canton de Fribourg)&lt;br /&gt;
* La Gruyère (Canton de Fribourg)&lt;br /&gt;
* Le Nouvelliste (Canton du Valais)&lt;br /&gt;
* Arc Info (Canton de Neuchâtel)&lt;br /&gt;
* Le Journal du Jura (partie francophone du Canton de Berne)&lt;br /&gt;
* Le Quotidien jurassien (Canton du Jura)&lt;br /&gt;
* La Côte (Région lémanique)&lt;br /&gt;
* La Région (Région Nord-vaudoise)&lt;br /&gt;
* Le Courrier (Romandie)&lt;br /&gt;
* Le Matin (Romandie)&lt;br /&gt;
* 20 Minutes (Romandie)&lt;br /&gt;
&lt;br /&gt;
24 heures :&lt;br /&gt;
https://www.24heures.ch/la-protection-civile-apprehende-une-baisse-drastique-de-ses-effectifs-630970735239&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Tribune de Genève :&lt;br /&gt;
https://www.tdg.ch/astrazeneca-double-ses-benefices-528778374505&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La Gruyère  : https://www.lagruyere.ch/2021/02/%C2%AB-nous-demand%C3%A9-de-nous-endetter-pour-la-soci%C3%A9t%C3%A9%C2%BB.html&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Le Nouvelliste : https://www.lenouvelliste.ch/articles/monde/reseaux-sociaux-twitter-ne-laissera-pas-revenir-donald-trump-1043625&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Matin : https://www.lematin.ch/story/il-faut-permettre-davantage-dactivites-pour-les-jeunes-916146511842&lt;br /&gt;
&lt;br /&gt;
Sélecteurs : cssselect.parse(&amp;#039;div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
20 Minutes : https://www.20min.ch/fr/story/futurs-apprentis-les-profs-genes-par-les-recruteurs-259502039975&lt;br /&gt;
&lt;br /&gt;
Sélecteurs : cssselect.parse(&amp;#039;div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d&amp;#039;une page d&amp;#039;article de lecourrier.ch&lt;br /&gt;
#article h1, article h2, article h3, article p et article time &lt;br /&gt;
 &lt;br /&gt;
import mechanize&lt;br /&gt;
 &lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
 &lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
 &lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
 &lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
 &lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
 &lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
 &lt;br /&gt;
data = br.open(&amp;#039;https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/&amp;#039;, timeout=10.0)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#on convertit un sélecteur css en objets de type &amp;quot;cssselector&amp;quot;&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
selecteursImages = cssselect.parse(&amp;#039;article .c-Article-imageFeatured img&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
for selecteur in selecteurs:&lt;br /&gt;
    print(selecteur)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        print(resultat.text_content())&lt;br /&gt;
&lt;br /&gt;
for selecteur in selecteursImages:&lt;br /&gt;
    print(selecteur)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        imageUrl = &amp;#039;https://lecourrier.ch&amp;#039;+resultat.get(&amp;#039;src&amp;#039;)&lt;br /&gt;
        print(&amp;#039;downloading&amp;#039;+imageUrl)&lt;br /&gt;
        filename = &amp;#039;test.jpg&amp;#039;&lt;br /&gt;
        data = br.open(imageUrl).read()&lt;br /&gt;
        &lt;br /&gt;
        save = open(filename, &amp;#039;wb&amp;#039;)&lt;br /&gt;
        save.write(data)&lt;br /&gt;
        save.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===17 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def getInfos(src, selecteurcss):&lt;br /&gt;
    selecteur = cssselect.parse(selecteurcss)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur[0], translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    return resultats&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/2&lt;br /&gt;
&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
thumbnails = getInfos(src, &amp;#039;span.thumbnail_url&amp;#039;)&lt;br /&gt;
descriptions = getInfos(src, &amp;#039;span.asset-descr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===10 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
#on part de l&amp;#039;url de la thumbnail: https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&lt;br /&gt;
#et l&amp;#039;url du lien pour le zoom: fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0&lt;br /&gt;
#on veut arriver à ça: https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/99816/size/3/type/1/filename/CMN_gmw20_0194&lt;br /&gt;
&lt;br /&gt;
thumbnailURL = input(&amp;#039;Entrer l\&amp;#039;url de la thumbnail&amp;#039;)&lt;br /&gt;
linkURL = input(&amp;#039;Entrer l\&amp;#039;url du lien&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
#thumbnailURL = &amp;#039;https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&amp;#039;&lt;br /&gt;
#linkURL = &amp;#039;fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#de l&amp;#039;url du lien on récupère l&amp;#039;id grâce à une expression régulière&lt;br /&gt;
searchObj = re.search( r&amp;#039;id/([0-9]+)/&amp;#039;, linkURL )&lt;br /&gt;
id = searchObj.group(1)&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&lt;br /&gt;
#de l&amp;#039;url de la thumbnail on récupère le nom du fichier sans l&amp;#039;extension&lt;br /&gt;
searchObj = re.search( r&amp;#039;/([^/]*)\.thw&amp;#039;, thumbnailURL )&lt;br /&gt;
fileName = searchObj.group(1)&lt;br /&gt;
&lt;br /&gt;
finalURL = &amp;#039;https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/&amp;#039;+id+&amp;#039;/size/3/type/1/filename/&amp;#039;+fileName&lt;br /&gt;
print(&amp;#039;Attention voici l\&amp;#039;URL de l\&amp;#039;image! &amp;#039; + finalURL)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===03 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#print(data.read())&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#on convertit un sélecteur css en objets de type &amp;quot;cssselector&amp;quot;&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2&amp;#039;)&lt;br /&gt;
#   0&lt;br /&gt;
#[selecteur1, selecteur2]&lt;br /&gt;
&lt;br /&gt;
#[selecteur de type cssselect]&lt;br /&gt;
&lt;br /&gt;
for selecteur in selecteurs:&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===26 novembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
print(data.read())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#print(data.read())&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
#une liste en python&lt;br /&gt;
#           0          1            2&lt;br /&gt;
liste = [&amp;#039;coucou&amp;#039;, &amp;#039;pouetpouet&amp;#039;, &amp;#039;byebye&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
print(liste[2])&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1&amp;#039;)&lt;br /&gt;
#[selecteur de type cssselect]&lt;br /&gt;
chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteurs[0], translate_pseudo_elements=True)&lt;br /&gt;
#selecteur de type xpath&lt;br /&gt;
&lt;br /&gt;
resultats = src.xpath(chemin_xpath)&lt;br /&gt;
#    0&lt;br /&gt;
#[html element]&lt;br /&gt;
print(resultats[0].text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formation HTML/CSS utile en complément du cours ici : ==&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=Y80juYcu3ZI&amp;amp;list=PLwLsbqvBlImHG5yeUCXJ1aqNMgUKi1NK3&lt;br /&gt;
&lt;br /&gt;
===19 novembre 2020===&lt;br /&gt;
&lt;br /&gt;
====html et css====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Sélecteurs css&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;link href=&amp;quot;styles.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;actualite&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;Ma section actualité&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;breve&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;h3&amp;gt;Sous-titre de l&amp;#039;article&amp;lt;/h3&amp;gt;&lt;br /&gt;
          &amp;lt;time&amp;gt;13:00&amp;lt;/time&amp;gt;&lt;br /&gt;
          &amp;lt;time&amp;gt;13:00&amp;lt;/time&amp;gt;&lt;br /&gt;
          &amp;lt;time data-type=&amp;quot;begin-hour&amp;quot;&amp;gt;15:00&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;article-full&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article 2&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article 2 &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article 2&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;article-full&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article 3&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article 3 &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article 3&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;archives&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;Ma section Archives&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;breve&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*pointeur css vers balise html*/&lt;br /&gt;
html, body{&lt;br /&gt;
  margin:0;&lt;br /&gt;
  padding:0;&lt;br /&gt;
}&lt;br /&gt;
h1{&lt;br /&gt;
  font-family:Helvetica, Arial, sans-serif;&lt;br /&gt;
  font-weight:normal;&lt;br /&gt;
  margin:10px;&lt;br /&gt;
  padding:10px;&lt;br /&gt;
  border:1px solid black;&lt;br /&gt;
}&lt;br /&gt;
/*pointeur css vers un ID*/&lt;br /&gt;
section#archives{&lt;br /&gt;
  background-color:gray;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
article{&lt;br /&gt;
  border-bottom:1px solid black;&lt;br /&gt;
}&lt;br /&gt;
/*pointeur css vers une classe*/&lt;br /&gt;
.breve{&lt;br /&gt;
  font-size:48pt;&lt;br /&gt;
  border-bottom:2px solid black;&lt;br /&gt;
}&lt;br /&gt;
.article-full{&lt;br /&gt;
  font-size:16pt;&lt;br /&gt;
}&lt;br /&gt;
/* pointeur css avec chemin */&lt;br /&gt;
section#actualite a{&lt;br /&gt;
  color:green;&lt;br /&gt;
}&lt;br /&gt;
section#actualite article.article-full a{&lt;br /&gt;
  color:red;&lt;br /&gt;
}&lt;br /&gt;
/* pointeur css avec chemin vers un enfant précis d&amp;#039;une balise */&lt;br /&gt;
section#actualite article.article-full:nth-child(3) a{&lt;br /&gt;
  color:pink;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*pointeur css avec un chemin vers un élément qui suit directement un autre élément*/&lt;br /&gt;
h3+time{&lt;br /&gt;
  background:green;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
time[data-type=&amp;#039;begin-hour&amp;#039;]{&lt;br /&gt;
  background:blue;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Librairies Python====&lt;br /&gt;
* pour naviguer:&lt;br /&gt;
** pycurl (http://pycurl.io/)&lt;br /&gt;
** urllib2 (https://docs.python.org/2/library/urllib2.html)&lt;br /&gt;
** requests (https://requests.readthedocs.io/en/master/)&lt;br /&gt;
** mechanize (https://mechanize.readthedocs.io/en/latest/index.html)&lt;br /&gt;
* pour parser:&lt;br /&gt;
** beautifulsoup (https://www.crummy.com/software/BeautifulSoup/bs4/doc/)&lt;br /&gt;
** lxml (https://lxml.de/xpathxslt.html)&lt;br /&gt;
** cssselect (https://cssselect.readthedocs.io/en/latest/)&lt;br /&gt;
&lt;br /&gt;
*User agent : &lt;br /&gt;
**What is my browser (https://www.whatismybrowser.com/guides/the-latest-user-agent/firefox)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
data = br.open(&amp;#039;https://poesie.webnet.fr/lesgrandsclassiques/Authors/B&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
for selector in cssselect.parse(&amp;#039;.author-list__link&amp;#039;):&lt;br /&gt;
    expression = cssselect.HTMLTranslator().selector_to_xpath(selector, translate_pseudo_elements=True)&lt;br /&gt;
    for result in src.xpath(expression):&lt;br /&gt;
        print(result.text_content())&lt;br /&gt;
        print(result.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pages des étudiant.e.s==&lt;br /&gt;
[[Utilisateur:Simon BLONDEAU|Simon Blondeau]]&lt;br /&gt;
&lt;br /&gt;
[[Page de William]]&lt;br /&gt;
&lt;br /&gt;
[[Mondher]]&lt;br /&gt;
&lt;br /&gt;
[[Lea]]&lt;br /&gt;
&lt;br /&gt;
[[MP Antoin]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:Pierreetheve|Pierre Ethève]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:Chloé|Chloé]]&lt;br /&gt;
&lt;br /&gt;
[[Jonquille]]&lt;br /&gt;
&lt;br /&gt;
[[margot]]&lt;br /&gt;
&lt;br /&gt;
[[Léo]]&lt;br /&gt;
&lt;br /&gt;
[[César]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:arthurlafontaine|Arthur Lafontaine]]&lt;br /&gt;
&lt;br /&gt;
[[Etienne Grignon]]&lt;br /&gt;
&lt;br /&gt;
==Déroulement du cours==&lt;br /&gt;
Le cours ne nécessite aucun prérequis si ce n&amp;#039;est une capacité d&amp;#039;attention pendant les séances. Cette attention implique qu&amp;#039;à certains moments, par exemple lors des moments de discussions ou de présentations, il sera demandé aux étudiant.e.s de fermer leur ordinateur, que l&amp;#039;usage des smartphones est interdit et que les étudiant.e.s doivent arriver à l&amp;#039;heure au cours (9h, le lundi matin).&lt;br /&gt;
&lt;br /&gt;
Comme il s&amp;#039;agit d&amp;#039;un cours technique, les travaux se feront majoritairement en classe et il n&amp;#039;est pas absolument nécessaire de travailler en dehors du cours, à part pour documenter les travaux ou préparer leurs présentations (les cotations).&lt;br /&gt;
&lt;br /&gt;
Le cours fonctionne en évaluation continue, ce qui signifie que chaque exercice réalisé en atelier aura une note attribuée. Pour réussir le cours, il faut essentiellement être présent.e.&lt;br /&gt;
&lt;br /&gt;
À cette évaluation continue s&amp;#039;ajoute deux notes en décembre et en mai qui correspondent aux moments de cotations. Il est demandé pour ces cotations de présenter une sélection des travaux réalisés jusque là.&lt;br /&gt;
&lt;br /&gt;
La difficulté technique, bien que présente, ne doit pas constituer une barrière pour assister au cours. Il ne sera pas demandé aux étudiant.e.s d&amp;#039;être performant.e.s mais plutôt de ne pas se braquer et d&amp;#039;accepter d&amp;#039;être inefficaces durant des périodes qui semblent parfois longues (voire trouver du plaisir dans ces périodes de recherches). L&amp;#039;entraide et le partage sont encouragés. Tout sera fait pour éviter des comportements de mise à distance du savoir entre celles et ceux &amp;quot;qui savent&amp;quot; et les &amp;quot;newbies&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Chaque étudiant.e a accès à ce wiki, qui servira durant toute l&amp;#039;année à documenter les travaux. La création des comptes pour le wiki se fait au début du deuxième cours (au moment de l&amp;#039;inscription au cours).&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=ERG::Code-2020-2&amp;diff=4754</id>
		<title>ERG::Code-2020-2</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=ERG::Code-2020-2&amp;diff=4754"/>
		<updated>2021-02-11T10:59:14Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : /* 11 février 2021 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
Ce cours est destiné aux étudiant.e.s de BAC3. Cette année, nous nous concentrons sur les bases de données, définies comme &amp;quot;une collection structurée d&amp;#039;éléments sur laquelle l&amp;#039;utilisateur.trice peut effectuer une série d&amp;#039;opérations: voir, naviguer, chercher&amp;quot; (Lev Manovich, &amp;#039;&amp;#039;Le langage des Nouveaux Médias&amp;#039;&amp;#039;). &lt;br /&gt;
&lt;br /&gt;
==Sessions==&lt;br /&gt;
===11 février 2021===&lt;br /&gt;
&lt;br /&gt;
Liste des sources: sites d&amp;#039;actualités, Suisse Romande&lt;br /&gt;
* 24 heures (Canton de Vaud)&lt;br /&gt;
* Tribune de Genève (Canton de Genève)&lt;br /&gt;
* Le Temps (Canton de Genève)&lt;br /&gt;
* La Liberté (Canton de Fribourg)&lt;br /&gt;
* La Gruyère (Canton de Fribourg)&lt;br /&gt;
* Le Nouvelliste (Canton du Valais)&lt;br /&gt;
* Arc Info (Canton de Neuchâtel)&lt;br /&gt;
* Le Journal du Jura (partie francophone du Canton de Berne)&lt;br /&gt;
* Le Quotidien jurassien (Canton du Jura)&lt;br /&gt;
* La Côte (Région lémanique)&lt;br /&gt;
* La Région (Région Nord-vaudoise)&lt;br /&gt;
* Le Courrier (Romandie)&lt;br /&gt;
* Le Matin (Romandie)&lt;br /&gt;
* 20 Minutes (Romandie)&lt;br /&gt;
&lt;br /&gt;
24 heures :&lt;br /&gt;
https://www.24heures.ch/la-protection-civile-apprehende-une-baisse-drastique-de-ses-effectifs-630970735239&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Tribune de Genève :&lt;br /&gt;
https://www.tdg.ch/astrazeneca-double-ses-benefices-528778374505&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La Gruyère  : https://www.lagruyere.ch/2021/02/%C2%AB-nous-demand%C3%A9-de-nous-endetter-pour-la-soci%C3%A9t%C3%A9%C2%BB.html&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Le Nouvelliste : https://www.lenouvelliste.ch/articles/monde/reseaux-sociaux-twitter-ne-laissera-pas-revenir-donald-trump-1043625&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, h2, article h3, article p, article time&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Le Matin : https://www.lematin.ch/story/il-faut-permettre-davantage-dactivites-pour-les-jeunes-916146511842&lt;br /&gt;
&lt;br /&gt;
Sélecteurs : cssselect.parse(&amp;#039;div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
20 Minutes : https://www.20min.ch/fr/story/futurs-apprentis-les-profs-genes-par-les-recruteurs-259502039975&lt;br /&gt;
&lt;br /&gt;
Sélecteurs : cssselect.parse(&amp;#039;div.Article_elementTitle__3we9B h1, div.Article_elementLead__2nNxU h2, h3, div.Article_elementTextblockarray__WdRYM p, .sc-17d1f6z-1.gBPCId&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants à partir d&amp;#039;une page d&amp;#039;article de lecourrier.ch&lt;br /&gt;
#article h1, article h2, article h3, article p et article time &lt;br /&gt;
 &lt;br /&gt;
import mechanize&lt;br /&gt;
 &lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
 &lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
 &lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
 &lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
 &lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
 &lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
 &lt;br /&gt;
data = br.open(&amp;#039;https://lecourrier.ch/2021/02/10/morten-gisselbaek-le-candidat-de-la-decroissance/&amp;#039;, timeout=10.0)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#on convertit un sélecteur css en objets de type &amp;quot;cssselector&amp;quot;&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1.c-Article-titre, article .c-Article-chapeau, article .c-Article-metaDate, article c-Article-metaJournaliste, article .c-Article-texte&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
selecteursImages = cssselect.parse(&amp;#039;article .c-Article-imageFeatured img&amp;#039;)&lt;br /&gt;
 &lt;br /&gt;
for selecteur in selecteurs:&lt;br /&gt;
    print(selecteur)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        print(resultat.text_content())&lt;br /&gt;
&lt;br /&gt;
for selecteur in selecteursImages:&lt;br /&gt;
    print(selecteur)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        imageUrl = &amp;#039;https://lecourrier.ch&amp;#039;+resultat.get(&amp;#039;src&amp;#039;)&lt;br /&gt;
        print(&amp;#039;downloading&amp;#039;+imageUrl)&lt;br /&gt;
        filename = &amp;#039;test.jpg&amp;#039;&lt;br /&gt;
        data = br.open(imageUrl).read()&lt;br /&gt;
        &lt;br /&gt;
        save = open(filename, &amp;#039;wb&amp;#039;)&lt;br /&gt;
        save.write(data)&lt;br /&gt;
        save.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===17 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def getInfos(src, selecteurcss):&lt;br /&gt;
    selecteur = cssselect.parse(selecteurcss)&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur[0], translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    return resultats&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/1&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr/fr/asset/link/104-technique-s-et-materiau-x/vitrail/page/2&lt;br /&gt;
&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
thumbnails = getInfos(src, &amp;#039;span.thumbnail_url&amp;#039;)&lt;br /&gt;
descriptions = getInfos(src, &amp;#039;span.asset-descr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===10 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
#on part de l&amp;#039;url de la thumbnail: https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&lt;br /&gt;
#et l&amp;#039;url du lien pour le zoom: fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0&lt;br /&gt;
#on veut arriver à ça: https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/99816/size/3/type/1/filename/CMN_gmw20_0194&lt;br /&gt;
&lt;br /&gt;
thumbnailURL = input(&amp;#039;Entrer l\&amp;#039;url de la thumbnail&amp;#039;)&lt;br /&gt;
linkURL = input(&amp;#039;Entrer l\&amp;#039;url du lien&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
#thumbnailURL = &amp;#039;https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&amp;#039;&lt;br /&gt;
#linkURL = &amp;#039;fr/asset/id/99816/tour-de-la-lanterne-lanterne-vitraux/fromSearch/1/initiatorAction/metadataInternalLink/mosaicCount/2877/thumbIndex/0&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#de l&amp;#039;url du lien on récupère l&amp;#039;id grâce à une expression régulière&lt;br /&gt;
searchObj = re.search( r&amp;#039;id/([0-9]+)/&amp;#039;, linkURL )&lt;br /&gt;
id = searchObj.group(1)&lt;br /&gt;
&lt;br /&gt;
#https://regards.monuments-nationaux.fr//thumbnails/00000000100/gmw20_0194.thw&lt;br /&gt;
#de l&amp;#039;url de la thumbnail on récupère le nom du fichier sans l&amp;#039;extension&lt;br /&gt;
searchObj = re.search( r&amp;#039;/([^/]*)\.thw&amp;#039;, thumbnailURL )&lt;br /&gt;
fileName = searchObj.group(1)&lt;br /&gt;
&lt;br /&gt;
finalURL = &amp;#039;https://regards.monuments-nationaux.fr/fr/asset/assetFile/id/&amp;#039;+id+&amp;#039;/size/3/type/1/filename/&amp;#039;+fileName&lt;br /&gt;
print(&amp;#039;Attention voici l\&amp;#039;URL de l\&amp;#039;image! &amp;#039; + finalURL)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===03 décembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#print(data.read())&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#on convertit un sélecteur css en objets de type &amp;quot;cssselector&amp;quot;&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1, article h2&amp;#039;)&lt;br /&gt;
#   0&lt;br /&gt;
#[selecteur1, selecteur2]&lt;br /&gt;
&lt;br /&gt;
#[selecteur de type cssselect]&lt;br /&gt;
&lt;br /&gt;
for selecteur in selecteurs:&lt;br /&gt;
    chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteur, translate_pseudo_elements=True)&lt;br /&gt;
    resultats = src.xpath(chemin_xpath)&lt;br /&gt;
    for resultat in resultats:&lt;br /&gt;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===26 novembre 2020===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
print(data.read())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#un programme qui récupère les données contenues dans les sélecteurs css suivants:&lt;br /&gt;
#article h1, div.lead, div.gr-media-image img, div.gr-article-content à partir d&amp;#039;une page d&amp;#039;article de lesoir.be&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
#initialisation d&amp;#039;un objet &amp;quot;navigateur&amp;quot; avec la librairie mechanize&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
#fin de la configuration de mechanize&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    _create_unverified_https_context = ssl._create_unverified_context&lt;br /&gt;
except AttributeError:&lt;br /&gt;
    # Legacy Python that doesn&amp;#039;t verify HTTPS certificates by default&lt;br /&gt;
    pass&lt;br /&gt;
else:&lt;br /&gt;
    # Handle target environment that doesn&amp;#039;t support HTTPS verification&lt;br /&gt;
    ssl._create_default_https_context = _create_unverified_https_context&lt;br /&gt;
&lt;br /&gt;
data = br.open(&amp;#039;https://www.lesoir.be/340088/article/2020-11-26/reouverture-des-commerces-fetes-ce-qui-sera-discute-par-le-comite-de&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#print(data.read())&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
#une liste en python&lt;br /&gt;
#           0          1            2&lt;br /&gt;
liste = [&amp;#039;coucou&amp;#039;, &amp;#039;pouetpouet&amp;#039;, &amp;#039;byebye&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
print(liste[2])&lt;br /&gt;
&lt;br /&gt;
selecteurs = cssselect.parse(&amp;#039;article h1&amp;#039;)&lt;br /&gt;
#[selecteur de type cssselect]&lt;br /&gt;
chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(selecteurs[0], translate_pseudo_elements=True)&lt;br /&gt;
#selecteur de type xpath&lt;br /&gt;
&lt;br /&gt;
resultats = src.xpath(chemin_xpath)&lt;br /&gt;
#    0&lt;br /&gt;
#[html element]&lt;br /&gt;
print(resultats[0].text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formation HTML/CSS utile en complément du cours ici : ==&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=Y80juYcu3ZI&amp;amp;list=PLwLsbqvBlImHG5yeUCXJ1aqNMgUKi1NK3&lt;br /&gt;
&lt;br /&gt;
===19 novembre 2020===&lt;br /&gt;
&lt;br /&gt;
====html et css====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Sélecteurs css&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;link href=&amp;quot;styles.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;section id=&amp;quot;actualite&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;Ma section actualité&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;breve&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
          &amp;lt;h3&amp;gt;Sous-titre de l&amp;#039;article&amp;lt;/h3&amp;gt;&lt;br /&gt;
          &amp;lt;time&amp;gt;13:00&amp;lt;/time&amp;gt;&lt;br /&gt;
          &amp;lt;time&amp;gt;13:00&amp;lt;/time&amp;gt;&lt;br /&gt;
          &amp;lt;time data-type=&amp;quot;begin-hour&amp;quot;&amp;gt;15:00&amp;lt;/time&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;article-full&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article 2&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article 2 &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article 2&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;article-full&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article 3&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article 3 &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article 3&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;archives&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;Ma section Archives&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;article class=&amp;quot;breve&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;header&amp;gt;Chapeau de l&amp;#039;article&amp;lt;/header&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&lt;br /&gt;
          Contenu de l&amp;#039;article &amp;lt;a href=&amp;quot;http://www.curlybraces.be&amp;quot;&amp;gt;Un lien vers un site&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;footer&amp;gt;Footer de l&amp;#039;article&amp;lt;/footer&amp;gt;&lt;br /&gt;
      &amp;lt;/article&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/*pointeur css vers balise html*/&lt;br /&gt;
html, body{&lt;br /&gt;
  margin:0;&lt;br /&gt;
  padding:0;&lt;br /&gt;
}&lt;br /&gt;
h1{&lt;br /&gt;
  font-family:Helvetica, Arial, sans-serif;&lt;br /&gt;
  font-weight:normal;&lt;br /&gt;
  margin:10px;&lt;br /&gt;
  padding:10px;&lt;br /&gt;
  border:1px solid black;&lt;br /&gt;
}&lt;br /&gt;
/*pointeur css vers un ID*/&lt;br /&gt;
section#archives{&lt;br /&gt;
  background-color:gray;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
article{&lt;br /&gt;
  border-bottom:1px solid black;&lt;br /&gt;
}&lt;br /&gt;
/*pointeur css vers une classe*/&lt;br /&gt;
.breve{&lt;br /&gt;
  font-size:48pt;&lt;br /&gt;
  border-bottom:2px solid black;&lt;br /&gt;
}&lt;br /&gt;
.article-full{&lt;br /&gt;
  font-size:16pt;&lt;br /&gt;
}&lt;br /&gt;
/* pointeur css avec chemin */&lt;br /&gt;
section#actualite a{&lt;br /&gt;
  color:green;&lt;br /&gt;
}&lt;br /&gt;
section#actualite article.article-full a{&lt;br /&gt;
  color:red;&lt;br /&gt;
}&lt;br /&gt;
/* pointeur css avec chemin vers un enfant précis d&amp;#039;une balise */&lt;br /&gt;
section#actualite article.article-full:nth-child(3) a{&lt;br /&gt;
  color:pink;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*pointeur css avec un chemin vers un élément qui suit directement un autre élément*/&lt;br /&gt;
h3+time{&lt;br /&gt;
  background:green;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
time[data-type=&amp;#039;begin-hour&amp;#039;]{&lt;br /&gt;
  background:blue;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Librairies Python====&lt;br /&gt;
* pour naviguer:&lt;br /&gt;
** pycurl (http://pycurl.io/)&lt;br /&gt;
** urllib2 (https://docs.python.org/2/library/urllib2.html)&lt;br /&gt;
** requests (https://requests.readthedocs.io/en/master/)&lt;br /&gt;
** mechanize (https://mechanize.readthedocs.io/en/latest/index.html)&lt;br /&gt;
* pour parser:&lt;br /&gt;
** beautifulsoup (https://www.crummy.com/software/BeautifulSoup/bs4/doc/)&lt;br /&gt;
** lxml (https://lxml.de/xpathxslt.html)&lt;br /&gt;
** cssselect (https://cssselect.readthedocs.io/en/latest/)&lt;br /&gt;
&lt;br /&gt;
*User agent : &lt;br /&gt;
**What is my browser (https://www.whatismybrowser.com/guides/the-latest-user-agent/firefox)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
&lt;br /&gt;
br = mechanize.Browser()&lt;br /&gt;
br.addheaders = [(&amp;#039;User-agent&amp;#039;, &amp;#039;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&amp;#039;)]&lt;br /&gt;
br.set_handle_robots(False)&lt;br /&gt;
data = br.open(&amp;#039;https://poesie.webnet.fr/lesgrandsclassiques/Authors/B&amp;#039;, timeout=10.0)&lt;br /&gt;
&lt;br /&gt;
#br.follow_link(text_regex=r&amp;quot;cheese\s*shop&amp;quot;, nr=1)&lt;br /&gt;
&lt;br /&gt;
#data = br.follow_link(url=r&amp;quot;/lesgrandsclassiques/Poemes&amp;quot;, nr=0)&lt;br /&gt;
&lt;br /&gt;
rawdata = data.read()&lt;br /&gt;
unicode = rawdata.decode(&amp;#039;utf-8&amp;#039;, &amp;#039;ignore&amp;#039;)&lt;br /&gt;
src = lh.fromstring(unicode)&lt;br /&gt;
&lt;br /&gt;
for selector in cssselect.parse(&amp;#039;.author-list__link&amp;#039;):&lt;br /&gt;
    expression = cssselect.HTMLTranslator().selector_to_xpath(selector, translate_pseudo_elements=True)&lt;br /&gt;
    for result in src.xpath(expression):&lt;br /&gt;
        print(result.text_content())&lt;br /&gt;
        print(result.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pages des étudiant.e.s==&lt;br /&gt;
[[Utilisateur:Simon BLONDEAU|Simon Blondeau]]&lt;br /&gt;
&lt;br /&gt;
[[Page de William]]&lt;br /&gt;
&lt;br /&gt;
[[Mondher]]&lt;br /&gt;
&lt;br /&gt;
[[Lea]]&lt;br /&gt;
&lt;br /&gt;
[[MP Antoin]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:Pierreetheve|Pierre Ethève]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:Chloé|Chloé]]&lt;br /&gt;
&lt;br /&gt;
[[Jonquille]]&lt;br /&gt;
&lt;br /&gt;
[[margot]]&lt;br /&gt;
&lt;br /&gt;
[[Léo]]&lt;br /&gt;
&lt;br /&gt;
[[César]]&lt;br /&gt;
&lt;br /&gt;
[[Utilisateur:arthurlafontaine|Arthur Lafontaine]]&lt;br /&gt;
&lt;br /&gt;
[[Etienne Grignon]]&lt;br /&gt;
&lt;br /&gt;
==Déroulement du cours==&lt;br /&gt;
Le cours ne nécessite aucun prérequis si ce n&amp;#039;est une capacité d&amp;#039;attention pendant les séances. Cette attention implique qu&amp;#039;à certains moments, par exemple lors des moments de discussions ou de présentations, il sera demandé aux étudiant.e.s de fermer leur ordinateur, que l&amp;#039;usage des smartphones est interdit et que les étudiant.e.s doivent arriver à l&amp;#039;heure au cours (9h, le lundi matin).&lt;br /&gt;
&lt;br /&gt;
Comme il s&amp;#039;agit d&amp;#039;un cours technique, les travaux se feront majoritairement en classe et il n&amp;#039;est pas absolument nécessaire de travailler en dehors du cours, à part pour documenter les travaux ou préparer leurs présentations (les cotations).&lt;br /&gt;
&lt;br /&gt;
Le cours fonctionne en évaluation continue, ce qui signifie que chaque exercice réalisé en atelier aura une note attribuée. Pour réussir le cours, il faut essentiellement être présent.e.&lt;br /&gt;
&lt;br /&gt;
À cette évaluation continue s&amp;#039;ajoute deux notes en décembre et en mai qui correspondent aux moments de cotations. Il est demandé pour ces cotations de présenter une sélection des travaux réalisés jusque là.&lt;br /&gt;
&lt;br /&gt;
La difficulté technique, bien que présente, ne doit pas constituer une barrière pour assister au cours. Il ne sera pas demandé aux étudiant.e.s d&amp;#039;être performant.e.s mais plutôt de ne pas se braquer et d&amp;#039;accepter d&amp;#039;être inefficaces durant des périodes qui semblent parfois longues (voire trouver du plaisir dans ces périodes de recherches). L&amp;#039;entraide et le partage sont encouragés. Tout sera fait pour éviter des comportements de mise à distance du savoir entre celles et ceux &amp;quot;qui savent&amp;quot; et les &amp;quot;newbies&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Chaque étudiant.e a accès à ce wiki, qui servira durant toute l&amp;#039;année à documenter les travaux. La création des comptes pour le wiki se fait au début du deuxième cours (au moment de l&amp;#039;inscription au cours).&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4656</id>
		<title>Léo</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4656"/>
		<updated>2021-01-19T19:46:33Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par lieu ainsi que par date. Etant très intéressé par l&amp;#039;urbanisme ainsi que par l&amp;#039;histoire, j&amp;#039;ai une grande curiosité pour ces vieilles cartes, et j&amp;#039;en consulte régulièrement. Je serai peut-être amené à en utiliser dans un projet artistique futur.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;SOURCES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
- https://www.geographicus.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.oldmapsonline.org/&lt;br /&gt;
&lt;br /&gt;
- https://commons.wikimedia.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.discusmedia.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.mapsofthepast.com/&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;STRUCTURE&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Structure.png]]&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;AVANCEMENT DU PREMIER QUADRI&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Mon projet a un peu évolué au cours du premier quadri. Je ne cherche plus uniquement des cartes de Paris et de Bruxelles, mais d&amp;#039;un maximum de villes différentes. Mon objectif final est d&amp;#039;avoir suffisamment de matière pour m&amp;#039;initier au machine learning. J&amp;#039;ai une vague première idée, celle d&amp;#039;un générateur automatique de cartes. Je n&amp;#039;ai aucune connaissance en machine learning, alors je verrai ce qu&amp;#039;il en sera à ce moment-là. Pour l&amp;#039;instant, je veux accumuler un maximum de données. L&amp;#039;idée sera alors d&amp;#039;exporter les images de chaque carte, avec un nom &amp;quot;ordonné&amp;quot; : ville-siècle.extension. Par exemple, Bruxelles-17.jpeg. Ensuite, je souhaite classer ces images pour les retrouver plus rapidement, en autant de sous-dossiers que possible. Par exemple, &amp;quot;Europe → Belgique → Flandre → Gand-15.png&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai réussi assez simplement à récupérer les infos qui m&amp;#039;intéressaient sur certains de mes sites sources (geographicus et mapsofthepast). Un problème auquel j&amp;#039;ai été confronté, fut de rendre l&amp;#039;information propre. Par exemple, lorsque je récupérais le titre de la carte, il y avait beaucoup d&amp;#039;infos inutiles. Comment, en partant de &amp;quot;Map of Brussels, from the royal archives&amp;quot;, réussir à obtenir &amp;quot;Bruxelles&amp;quot; ?&lt;br /&gt;
&lt;br /&gt;
J&amp;#039;ai dû coder un petit bout de programme qui me permettait, premièrement, de nettoyer la phrase de tous les caractères inutiles comme les virgules, parenthèses, etc.&lt;br /&gt;
&lt;br /&gt;
Ensuite, le programme me permettait d&amp;#039;isoler chaque mot, afin qu&amp;#039;il soit lu séparément. J&amp;#039;utilisais alors la librairie &amp;quot;Geonamescache&amp;quot; pour identifier les noms de villes parmi les mots. Une fois ceux-ci trouvés et les mots inutiles enlevés, j&amp;#039;utilisais la bibliothèque deep_translator pour automatiquement détecter la langue dans laquelle le nom de la ville était écrit, puis pour le traduire en français.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;OBJECTIFS DU SECOND QUADRI&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Mon premier objectif à court terme sera d&amp;#039;améliorer ce que j&amp;#039;ai déjà fait. J&amp;#039;ai deux problèmes principaux : &lt;br /&gt;
&lt;br /&gt;
1 - Mon code est vraiment dégueulasse, c&amp;#039;est en grande partie pour ça que je ne le poste pas ici. J&amp;#039;apprends peu à peu le python, et me rends compte que je peux faire un code bien plus propre et compréhensible, notamment en utilisant des fonctions au lieu de recopier le même code à chaque fois. Je veux donc reprendre ce que j&amp;#039;ai fait, et le rendre plus compréhensible, car sinon je vais vite me perdre.&lt;br /&gt;
&lt;br /&gt;
2 - En passant par la bibliothèque deep_translator, j&amp;#039;utilise un plugin google trad pour traduire les noms des villes. Problème : j&amp;#039;ai un nombre de requêtes (très) limité. Quand on les dépasse, le programme plante. Impossible de compter là-dessus pour la suite, alors je dois trouver une autre alternative. J&amp;#039;ai besoin de pouvoir détecter la langue automatiquement car il y en a de toutes sortes dans les noms des cartes, et aussi de traduire automatiquement. Je vais réfléchir à une solution dans ces prochaines semaines.&lt;br /&gt;
&lt;br /&gt;
Une fois que j&amp;#039;aurai fait ça, je pourrai me pencher sur la suite. En vrac :&lt;br /&gt;
&lt;br /&gt;
- Adapter mon code à tous mes sites&lt;br /&gt;
- Extraire les images&lt;br /&gt;
- Trouver comment automatiquement les renommer&lt;br /&gt;
- Trouver comment automatiquement les ranger&lt;br /&gt;
- Commencer à regarder le machine learning de plus près&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4427</id>
		<title>Léo</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4427"/>
		<updated>2020-12-06T18:57:39Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : /* SOURCES */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par lieu ainsi que par date. Etant très intéressé par l&amp;#039;urbanisme ainsi que par l&amp;#039;histoire, j&amp;#039;ai une grande curiosité pour ces vieilles cartes, et j&amp;#039;en consulte régulièrement. Je serai peut-être amené à en utiliser dans un projet artistique futur.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;SOURCES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
- https://www.geographicus.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.oldmapsonline.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.sanderusmaps.com/&lt;br /&gt;
&lt;br /&gt;
- https://commons.wikimedia.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.discusmedia.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.mapsofthepast.com/&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;STRUCTURE&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Structure.png]]&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4353</id>
		<title>Léo</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4353"/>
		<updated>2020-10-28T10:18:50Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : /* STRUCTURE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par lieu ainsi que par date. Etant très intéressé par l&amp;#039;urbanisme ainsi que par l&amp;#039;histoire, j&amp;#039;ai une grande curiosité pour ces vieilles cartes, et j&amp;#039;en consulte régulièrement. Je serai peut-être amené à en utiliser dans un projet artistique futur.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;SOURCES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
- https://remonterletemps.ign.fr/&lt;br /&gt;
&lt;br /&gt;
- https://www.geographicus.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.oldmapsonline.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.sanderusmaps.com/&lt;br /&gt;
&lt;br /&gt;
- https://commons.wikimedia.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.discusmedia.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.mapsofthepast.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.pinterest.fr&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;STRUCTURE&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Structure.png]]&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Structure.png&amp;diff=4352</id>
		<title>Fichier:Structure.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Structure.png&amp;diff=4352"/>
		<updated>2020-10-28T10:17:45Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : Structure Ouzegdouh Léo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Structure Ouzegdouh Léo&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4351</id>
		<title>Léo</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=L%C3%A9o&amp;diff=4351"/>
		<updated>2020-10-28T09:52:17Z</updated>

		<summary type="html">&lt;p&gt;Leo Ouzegdouh : Page créée avec «  = &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; = Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par li... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;PROJET&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
Je souhaite créer une base de données collectant un maximum de cartes anciennes, principalement de Bruxelles et de Paris, et classant ces cartes par lieu ainsi que par date. Etant très intéressé par l&amp;#039;urbanisme ainsi que par l&amp;#039;histoire, j&amp;#039;ai une grande curiosité pour ces vieilles cartes, et j&amp;#039;en consulte régulièrement. Je serai peut-être amené à en utiliser dans un projet artistique futur.&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;SOURCES&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
- https://remonterletemps.ign.fr/&lt;br /&gt;
&lt;br /&gt;
- https://www.geographicus.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.oldmapsonline.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.sanderusmaps.com/&lt;br /&gt;
&lt;br /&gt;
- https://commons.wikimedia.org/&lt;br /&gt;
&lt;br /&gt;
- https://www.discusmedia.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.mapsofthepast.com/&lt;br /&gt;
&lt;br /&gt;
- https://www.pinterest.fr&lt;br /&gt;
&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;STRUCTURE&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&lt;br /&gt;
A venir&lt;/div&gt;</summary>
		<author><name>Leo Ouzegdouh</name></author>
	</entry>
</feed>