<?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=Mondher</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=Mondher"/>
	<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/Sp%C3%A9cial:Contributions/Mondher"/>
	<updated>2026-04-17T06:58:27Z</updated>
	<subtitle>Contributions de l’utilisateur</subtitle>
	<generator>MediaWiki 1.35.10</generator>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5011</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5011"/>
		<updated>2021-04-25T17:17:07Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour de la liste de quotidiens retenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Liste des sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-selecteurs.jpg]][[Fichier:Mndr-selecteurs2.jpg]][[Fichier:Mndr-selecteurs3.jpg]][[Fichier:Mndr-selecteurs4.jpg]]&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, il nous reste à repérer les sélecteurs adéquats pour chaque source, et tester le code source par source pour être sûr de ces sélecteurs. Malheureusement, nous n&amp;#039;avons pas encore pu terminer cette étape pour aujourd&amp;#039;hui 25.04, veille de la cotation du deuxième quadri. C&amp;#039;est un peu frustrant, mais c&amp;#039;est un travail qui sera fait très prochainement.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous pourrons exécuter des requêtes afin de récupérer certaines données, puis les utiliser dans le cadre de la deuxième partie de ce travail.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5010</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5010"/>
		<updated>2021-04-25T17:16:17Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour de la liste de quotidiens retenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Liste des sélecteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-selecteurs.jpg]][[Fichier:Mndr-selecteurs2.jpg]][[Fichier:Mndr-selecteurs3.jpg]][[Fichier:Mndr-selecteurs4.jpg]]&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, il nous reste à repérer les sélecteurs adéquats pour chaque source, et tester le code source par source pour être sûr de ces sélecteurs. Malheureusement, nous n&amp;#039;avons pas encore pu terminer cette étape pour aujourd&amp;#039;hui 25.04, veille de la cotation du deuxième quadri. C&amp;#039;est un peu frustrant, mais c&amp;#039;est un travail qui sera fait très prochainement.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous pourrons exécuter des requêtes afin de récupérer certaines données, puis les utiliser dans le cadre de la deuxième partie de ce travail.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs4.jpg&amp;diff=5009</id>
		<title>Fichier:Mndr-selecteurs4.jpg</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs4.jpg&amp;diff=5009"/>
		<updated>2021-04-25T17:15:34Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs3.jpg&amp;diff=5008</id>
		<title>Fichier:Mndr-selecteurs3.jpg</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs3.jpg&amp;diff=5008"/>
		<updated>2021-04-25T17:15:24Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs2.jpg&amp;diff=5007</id>
		<title>Fichier:Mndr-selecteurs2.jpg</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs2.jpg&amp;diff=5007"/>
		<updated>2021-04-25T17:15:14Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs.jpg&amp;diff=5006</id>
		<title>Fichier:Mndr-selecteurs.jpg</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-selecteurs.jpg&amp;diff=5006"/>
		<updated>2021-04-25T17:15:01Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5005</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5005"/>
		<updated>2021-04-25T17:14:29Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour de la liste de quotidiens retenus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Liste des sélecteurs :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Exemple.jpg]][[Fichier:Exemple.jpg]][[Fichier:Exemple.jpg]][[Fichier:Exemple.jpg]]&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, il nous reste à repérer les sélecteurs adéquats pour chaque source, et tester le code source par source pour être sûr de ces sélecteurs. Malheureusement, nous n&amp;#039;avons pas encore pu terminer cette étape pour aujourd&amp;#039;hui 25.04, veille de la cotation du deuxième quadri. C&amp;#039;est un peu frustrant, mais c&amp;#039;est un travail qui sera fait très prochainement.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous pourrons exécuter des requêtes afin de récupérer certaines données, puis les utiliser dans le cadre de la deuxième partie de ce travail.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5004</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5004"/>
		<updated>2021-04-25T17:09:05Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* C&amp;#039;est cool mais : problèmes rencontrés à cette étape */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, il nous reste à repérer les sélecteurs adéquats pour chaque source, et tester le code source par source pour être sûr de ces sélecteurs. Malheureusement, nous n&amp;#039;avons pas encore pu terminer cette étape pour aujourd&amp;#039;hui 25.04, veille de la cotation du deuxième quadri. C&amp;#039;est un peu frustrant, mais c&amp;#039;est un travail qui sera fait très prochainement.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous pourrons exécuter des requêtes afin de récupérer certaines données, puis les utiliser dans le cadre de la deuxième partie de ce travail.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5003</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5003"/>
		<updated>2021-04-25T17:08:24Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* C&amp;#039;est cool mais : problèmes rencontrés à cette étape */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, il nous reste à repérer les sélecteurs adéquats pour chaque source, et tester le code source par source pour être sûr de ces sélecteurs. Malheureusement, nous n&amp;#039;avons pas encore pu terminer cette étape au 25.04. C&amp;#039;est un peu frustrant, mais c&amp;#039;est un travail qui sera fait très prochainement.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous pourrons exécuter des requêtes afin de récupérer certaines données, puis les utiliser dans le cadre de la deuxième partie de ce travail.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5002</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5002"/>
		<updated>2021-04-25T17:03:08Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma et de la base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5001</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5001"/>
		<updated>2021-04-25T17:02:37Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma et de la base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;\syntaxhilight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5000</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=5000"/>
		<updated>2021-04-25T17:02:23Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma et de la base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhilight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4999</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4999"/>
		<updated>2021-04-25T17:01:57Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma et de la base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Informations de connexion à la base de données :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhilight=lang&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhilight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4998</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4998"/>
		<updated>2021-04-25T17:00:20Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* 11.03.21 : Travail en binôme avec Lea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4997</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4997"/>
		<updated>2021-04-25T16:58:26Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* 11.03.21 : Travail en binôme avec Lea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Aperçu du code à cette étape&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
import ssl&lt;br /&gt;
import os&lt;br /&gt;
from urllib.parse import urlparse&lt;br /&gt;
import mysql.connector as mysql&lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#initialisation de l&amp;#039;objet db, interface avec la base de données mysql&lt;br /&gt;
db = mysql.connect(&lt;br /&gt;
    host = &amp;quot;localhost&amp;quot;,&lt;br /&gt;
    port = &amp;quot;8889&amp;quot;,&lt;br /&gt;
    user = &amp;quot;root&amp;quot;,&lt;br /&gt;
    passwd = &amp;quot;root&amp;quot;,&lt;br /&gt;
    database = &amp;quot;indice_popularité_termes&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
            data.append(date)&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    #  {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lenouvelliste.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.arcinfo.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a, h3 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.heidi.news&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lacote.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h3 a, h2 a&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article datetime&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://lecourrier.ch&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.c-Card-permalink&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article metaDate&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
     {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;https://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;source_id&amp;#039;:1,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1.article__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;meta[property=&amp;quot;og:article:published_time&amp;quot;]&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_content_date&amp;#039;},  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.lefigaro.fr&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.ensemble__link, a.fig-profile__link, fig-ensemble__link, a.fig-ensemble__first-article-link&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[ &lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.fig-content-metas__pub-date fig-content-metas__pub-date--hide-small&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},  &lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&lt;br /&gt;
    # {&lt;br /&gt;
    #     &amp;#039;url&amp;#039;:&amp;#039;https://www.la-croix.com&amp;#039;,&lt;br /&gt;
    #     &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;a.block-item__title&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
    #     &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #         {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;div .font_xs color_grey margin-xxs-right font_tertiary&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
    #     ]&lt;br /&gt;
 &lt;br /&gt;
    # },&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;
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;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: checker si l&amp;#039;url de l&amp;#039;article se trouve déjà dans la table article de la db. si il y est, skipper le reste des opérations&lt;br /&gt;
        query = &amp;quot;SELECT * FROM article WHERE url=&amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
        alreadyInDB = False&lt;br /&gt;
        with db.cursor() as cursor:&lt;br /&gt;
            cursor.execute(query)&lt;br /&gt;
            result = cursor.fetchall()&lt;br /&gt;
            if len(result) &amp;gt; 0:&lt;br /&gt;
                alreadyInDB = True&lt;br /&gt;
 &lt;br /&gt;
        if(alreadyInDB == True):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #5bis: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        # print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        # print(sourceUrl)&lt;br /&gt;
        # #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        # #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #     #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
        #     #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
 &lt;br /&gt;
        if(len(dataArticle[0]) == 0):&lt;br /&gt;
            continue&lt;br /&gt;
 &lt;br /&gt;
        #[[&amp;#039;Les Etats-Unis et la Chine «\xa0s’engagent à coopérer\xa0» sur la crise climatique&amp;#039;], [&amp;#039;2021-04-18 02:33:09&amp;#039;]]&lt;br /&gt;
        # #11: insérer le tableau dans la base de données&lt;br /&gt;
        query = &amp;quot;INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;&amp;quot;+dataArticle[0][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+dataArticle[1][0]+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+urlArticle+&amp;quot;&amp;#039;, &amp;#039;&amp;quot;+str(sourceId)+&amp;quot;&amp;#039;)&amp;quot;&lt;br /&gt;
        print(query)&lt;br /&gt;
        # query = &amp;quot;INSERT INTO article (titre, date_crea, source_id) VALUES (&amp;#039;%s&amp;#039;, &amp;#039;%s&amp;#039;, 1)&amp;quot; % (dataArticle[0], dataArticle[1])&lt;br /&gt;
 &lt;br /&gt;
        cursor = db.cursor()&lt;br /&gt;
        cursor.execute(query)&lt;br /&gt;
        db.commit()&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4996</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4996"/>
		<updated>2021-04-25T16:55:34Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* C&amp;#039;est cool mais : problèmes rencontrés à cette étape */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_leparisien.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_leparisien.png&amp;diff=4995</id>
		<title>Fichier:Mndr test leparisien.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_leparisien.png&amp;diff=4995"/>
		<updated>2021-04-25T16:55:15Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4994</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4994"/>
		<updated>2021-04-25T16:54:55Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* C&amp;#039;est cool mais : problèmes rencontrés à cette étape */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Apparemment, beaucoup de nos sélecteurs ne sont pas les bons. En lançant l&amp;#039;opération de récupération à partir d&amp;#039;une autre source (ici, leparisien.fr), le terminal nous indique qu&amp;#039;il n&amp;#039;y a pas les chaînes de caractères attendues dans les sélecteurs renseignés.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Exemple.jpg]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4993</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4993"/>
		<updated>2021-04-25T16:50:24Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;C&amp;#039;est cool mais : problèmes rencontrés à cette étape&amp;#039;&amp;#039;&amp;#039; ===&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4992</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4992"/>
		<updated>2021-04-25T16:48:29Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4991</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4991"/>
		<updated>2021-04-25T16:48:18Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4990</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4990"/>
		<updated>2021-04-25T16:48:06Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
En regardant dans la base de données, on constate que celles-ci ont bien été récupérées et stockées de la manière attendue (c&amp;#039;est très satisfaisant à constater).&lt;br /&gt;
[[Fichier:Mndr_test_lemonde-bdd.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde-bdd.png&amp;diff=4989</id>
		<title>Fichier:Mndr test lemonde-bdd.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde-bdd.png&amp;diff=4989"/>
		<updated>2021-04-25T16:46:03Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4988</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4988"/>
		<updated>2021-04-25T16:45:44Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Avec cette source, toutes les opérations fonctionnent. On remarque quu&amp;#039;il y a systématiquement et dans le même ordre : l&amp;#039;élément source de la page, l&amp;#039;url de l&amp;#039;article, son titre, sa date de publication dans le format que nous avons uniformisé, puis la requête sql pour insérer ces données dans les tables titre, date_crea, url et source_id de la base de données.&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4987</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4987"/>
		<updated>2021-04-25T16:41:11Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4986</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4986"/>
		<updated>2021-04-25T16:41:04Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4985</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4985"/>
		<updated>2021-04-25T16:40:54Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr_test_lemonde2.png]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4984</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4984"/>
		<updated>2021-04-25T16:40:45Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr_test_lemonde2]]&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde2.png&amp;diff=4983</id>
		<title>Fichier:Mndr test lemonde2.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde2.png&amp;diff=4983"/>
		<updated>2021-04-25T16:40:08Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4982</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4982"/>
		<updated>2021-04-25T16:38:38Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr_test_lemonde.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Last login: Sun Apr 25 18:34:37 on ttys000&lt;br /&gt;
/Users/monzir/.zprofile:source:1: no such file or directory: /Users/monzir/.profile&lt;br /&gt;
monzir@MBP-de-Geoffroy ~ % cd /Users/monzir/Desktop/erg/Cours/Programmation/22-04-21&lt;br /&gt;
monzir@MBP-de-Geoffroy 22-04-21 % python3 lemonde.py&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2745e50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/disparitions/article/2021/04/25/mort-du-createur-de-mode-alber-elbaz-ancien-styliste-de-la-maison-lanvin_6077993_3382.html&lt;br /&gt;
[[&amp;#039;Mort du créateur de mode Alber Elbaz, ancien directeur artistique de la maison Lanvin&amp;#039;], [&amp;#039;2021-04-25 11:13:16&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Mort du créateur de mode Alber Elbaz, ancien directeur artistique de la maison Lanvin&amp;#039;, &amp;#039;2021-04-25 11:13:16&amp;#039;, &amp;#039;https://www.lemonde.fr/disparitions/article/2021/04/25/mort-du-createur-de-mode-alber-elbaz-ancien-styliste-de-la-maison-lanvin_6077993_3382.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789d60&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/scepticisme-des-opposants-au-regime-militaire-apres-le-sommet-de-l-asean-sur-la-birmanie_6078009_3210.html&lt;br /&gt;
[[&amp;#039;Scepticisme des opposants au régime militaire après le sommet de l’Asean sur la Birmanie&amp;#039;], [&amp;#039;2021-04-25 14:44:26&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Scepticisme des opposants au régime militaire après le sommet de l’Asean sur la Birmanie&amp;#039;, &amp;#039;2021-04-25 14:44:26&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/scepticisme-des-opposants-au-regime-militaire-apres-le-sommet-de-l-asean-sur-la-birmanie_6078009_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27897c0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/23/hotel-seances-numeriques-lieux-ephemeres-le-cinema-se-reinvente-en-temps-de-covid_6077829_4500055.html&lt;br /&gt;
[[&amp;#039;Hôtel, séances numériques, lieux éphémères… Le cinéma se réinvente en temps de Covid&amp;#039;], [&amp;#039;2021-04-23 15:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Hôtel, séances numériques, lieux éphémères… Le cinéma se réinvente en temps de Covid&amp;#039;, &amp;#039;2021-04-23 15:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/23/hotel-seances-numeriques-lieux-ephemeres-le-cinema-se-reinvente-en-temps-de-covid_6077829_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789c20&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/23/en-tunisie-les-nouveaux-visages-de-la-colere_6077721_4500055.html&lt;br /&gt;
[[&amp;#039;En Tunisie, les nouveaux visages de la colère&amp;#039;], [&amp;#039;2021-04-22 23:45:02&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;En Tunisie, les nouveaux visages de la colère&amp;#039;, &amp;#039;2021-04-22 23:45:02&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/23/en-tunisie-les-nouveaux-visages-de-la-colere_6077721_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789d60&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/vanessa-codaccioni-les-policiers-incarnent-le-monopole-de-la-violence-physique-legitime-de-l-etat_6078000_3224.html&lt;br /&gt;
[[&amp;#039;Vanessa Codaccioni\xa0: «\xa0Les policiers incarnent le monopole de la violence physique légitime de l’Etat\xa0»&amp;#039;], [&amp;#039;2021-04-25 13:00:12&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Vanessa Codaccioni : « Les policiers incarnent le monopole de la violence physique légitime de l’Etat »&amp;#039;, &amp;#039;2021-04-25 13:00:12&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/vanessa-codaccioni-les-policiers-incarnent-le-monopole-de-la-violence-physique-legitime-de-l-etat_6078000_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796ef0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/attaque-de-rambouillet-le-procureur-antiterroriste-evoque-une-radicalisation-peu-contestable-et-des-troubles-de-la-personnalite_6077992_3224.html&lt;br /&gt;
[[&amp;#039;Attaque de Rambouillet\xa0: le procureur antiterroriste évoque «\xa0une radicalisation peu contestable\xa0» et «\xa0des troubles de la personnalité\xa0»&amp;#039;], [&amp;#039;2021-04-25 10:57:46&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Attaque de Rambouillet : le procureur antiterroriste évoque « une radicalisation peu contestable » et « des troubles de la personnalité »&amp;#039;, &amp;#039;2021-04-25 10:57:46&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/attaque-de-rambouillet-le-procureur-antiterroriste-evoque-une-radicalisation-peu-contestable-et-des-troubles-de-la-personnalite_6077992_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796f90&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/sport/article/2021/04/25/cyclisme-tadej-pogacar-devance-julian-alaphilippe-et-remporte-la-course-liege-bastogne-liege_6078011_3242.html&lt;br /&gt;
[[&amp;#039;Cyclisme\xa0: Tadej Pogacar devance Julian Alaphilippe et remporte la course Liège-Bastogne-Liège&amp;#039;], [&amp;#039;2021-04-25 15:40:41&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Cyclisme : Tadej Pogacar devance Julian Alaphilippe et remporte la course Liège-Bastogne-Liège&amp;#039;, &amp;#039;2021-04-25 15:40:41&amp;#039;, &amp;#039;https://www.lemonde.fr/sport/article/2021/04/25/cyclisme-tadej-pogacar-devance-julian-alaphilippe-et-remporte-la-course-liege-bastogne-liege_6078011_3242.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796630&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/la-joie-et-le-soulagement-des-feministes-qui-se-decouvrent-lesbiennes_6077968_3224.html&lt;br /&gt;
[[&amp;#039;La «\xa0joie\xa0» et le «\xa0soulagement\xa0» des féministes qui se «\xa0découvrent\xa0» lesbiennes&amp;#039;], [&amp;#039;2021-04-25 05:00:07&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;La « joie » et le « soulagement » des féministes qui se « découvrent » lesbiennes&amp;#039;, &amp;#039;2021-04-25 05:00:07&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/la-joie-et-le-soulagement-des-feministes-qui-se-decouvrent-lesbiennes_6077968_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27963b0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/indonesie-le-sous-marin-disparu-au-large-de-bali-retrouve-aucun-survivant-parmi-les-53-membres-d-equipage_6077998_3210.html&lt;br /&gt;
[[&amp;#039;Indonésie\xa0: le sous-marin disparu au large de Bali retrouvé, aucun survivant parmi les 53 membres d’équipage&amp;#039;], [&amp;#039;2021-04-25 12:23:17&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Indonésie : le sous-marin disparu au large de Bali retrouvé, aucun survivant parmi les 53 membres d’équipage&amp;#039;, &amp;#039;2021-04-25 12:23:17&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/indonesie-le-sous-marin-disparu-au-large-de-bali-retrouve-aucun-survivant-parmi-les-53-membres-d-equipage_6077998_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a4cc0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/irak-un-incendie-dans-une-unite-de-soins-pour-malades-du-covid-19-fait-au-moins-vingt-trois-morts_6077958_3210.html&lt;br /&gt;
[[&amp;#039;Irak\xa0: un incendie dans un hôpital de Bagdad fait au moins 82\xa0morts, le ministre de la santé suspendu&amp;#039;], [&amp;#039;2021-04-24 23:46:23&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Irak : un incendie dans un hôpital de Bagdad fait au moins 82 morts, le ministre de la santé suspendu&amp;#039;, &amp;#039;2021-04-24 23:46:23&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/irak-un-incendie-dans-une-unite-de-soins-pour-malades-du-covid-19-fait-au-moins-vingt-trois-morts_6077958_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a48b0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/25/carton-rouge-du-foot-allemand-contre-l-homophobie-de-viktor-orban_6077966_4500055.html&lt;br /&gt;
[[&amp;#039;Carton rouge du foot allemand contre l’homophobie de Viktor Orbán&amp;#039;], [&amp;#039;2021-04-25 04:00:11&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Carton rouge du foot allemand contre l’homophobie de Viktor Orbán&amp;#039;, &amp;#039;2021-04-25 04:00:11&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/25/carton-rouge-du-foot-allemand-contre-l-homophobie-de-viktor-orban_6077966_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a4ae0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/economie/article/2021/04/24/le-palladium-gonfle-a-l-helium_6077878_3234.html&lt;br /&gt;
[[&amp;#039;Le palladium gonflé à l’hélium&amp;#039;], [&amp;#039;2021-04-23 22:58:49&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Le palladium gonflé à l’hélium&amp;#039;, &amp;#039;2021-04-23 22:58:49&amp;#039;, &amp;#039;https://www.lemonde.fr/economie/article/2021/04/24/le-palladium-gonfle-a-l-helium_6077878_3234.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27ace50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/24/affaire-sarah-halimi-l-absence-de-discernement-est-peut-etre-la-signature-meme-du-demon-antisemite_6077891_3232.html&lt;br /&gt;
[[&amp;#039;Affaire Sarah Halimi: «\xa0L’absence de discernement est peut-être la signature même du démon antisémite\xa0»&amp;#039;], [&amp;#039;2021-04-24 04:30:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Affaire Sarah Halimi: « L’absence de discernement est peut-être la signature même du démon antisémite »&amp;#039;, &amp;#039;2021-04-24 04:30:14&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/24/affaire-sarah-halimi-l-absence-de-discernement-est-peut-etre-la-signature-meme-du-demon-antisemite_6077891_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27acef0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/23/super-ligue-les-supporteurs-veulent-retrouver-le-sens-de-la-surprise-et-renouer-avec-la-tradition-d-un-football-spectaculaire-et-festif_6077836_3232.html&lt;br /&gt;
[[&amp;#039;Super Ligue\xa0:\xa0«\xa0Les supporteurs veulent retrouver le sens de la surprise et renouer avec la tradition d’un football spectaculaire et festif\xa0»&amp;#039;], [&amp;#039;2021-04-23 16:00:18&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Super Ligue : « Les supporteurs veulent retrouver le sens de la surprise et renouer avec la tradition d’un football spectaculaire et festif »&amp;#039;, &amp;#039;2021-04-23 16:00:18&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/23/super-ligue-les-supporteurs-veulent-retrouver-le-sens-de-la-surprise-et-renouer-avec-la-tradition-d-un-football-spectaculaire-et-festif_6077836_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27aca40&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/25/l-approche-one-health-restera-longtemps-un-instrument-de-communication-politique-plutot-qu-un-levier-d-action_6078014_3232.html&lt;br /&gt;
[[&amp;#039;«\xa0L’approche “One Health” restera longtemps un instrument de communication politique plutôt qu’un levier d’action\xa0»&amp;#039;], [&amp;#039;2021-04-25 16:00:39&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;« L’approche “One Health” restera longtemps un instrument de communication politique plutôt qu’un levier d’action »&amp;#039;, &amp;#039;2021-04-25 16:00:39&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/25/l-approche-one-health-restera-longtemps-un-instrument-de-communication-politique-plutot-qu-un-levier-d-action_6078014_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27ac1d0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/25/maria-negreponti-delivanis-la-grece-doit-crier-a-la-face-du-monde-qu-elle-a-le-droit-d-annuler-immediatement-sa-dette_6078016_3232.html&lt;br /&gt;
[[&amp;#039;Maria Negreponti-Delivanis\xa0: «\xa0La Grèce doit crier à la face du monde qu’elle a le droit d’annuler immédiatement sa dette\xa0»&amp;#039;], [&amp;#039;2021-04-25 16:30:13&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Maria Negreponti-Delivanis : « La Grèce doit crier à la face du monde qu’elle a le droit d’annuler immédiatement sa dette »&amp;#039;, &amp;#039;2021-04-25 16:30:13&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/25/maria-negreponti-delivanis-la-grece-doit-crier-a-la-face-du-monde-qu-elle-a-le-droit-d-annuler-immediatement-sa-dette_6078016_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3c20&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-le-pen-fidelise-ses-soutiens-malgre-la-grande-mobilite-electorale_6077924_823448.html&lt;br /&gt;
[[&amp;#039;Présidentielle 2022 : Marine Le Pen fidélise ses soutiens malgré la grande mobilité électorale&amp;#039;], [&amp;#039;2021-04-24 10:04:01&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Présidentielle 2022 : Marine Le Pen fidélise ses soutiens malgré la grande mobilité électorale&amp;#039;, &amp;#039;2021-04-24 10:04:01&amp;#039;, &amp;#039;https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-le-pen-fidelise-ses-soutiens-malgre-la-grande-mobilite-electorale_6077924_823448.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3bd0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-xavier-bertrand-emerge-mais-fait-face-a-de-nombreux-defis_6077925_823448.html&lt;br /&gt;
[[&amp;#039;Présidentielle 2022\xa0: Xavier Bertrand émerge mais fait face à de nombreux défis&amp;#039;], [&amp;#039;2021-04-24 10:04:21&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Présidentielle 2022 : Xavier Bertrand émerge mais fait face à de nombreux défis&amp;#039;, &amp;#039;2021-04-24 10:04:21&amp;#039;, &amp;#039;https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-xavier-bertrand-emerge-mais-fait-face-a-de-nombreux-defis_6077925_823448.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3360&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/afrique/article/2021/04/20/amadou-kone-l-ancien-militaire-devenu-le-premier-maraicher-bio-de-cote-d-ivoire_6077418_3212.html&lt;br /&gt;
[[&amp;#039;Amadou Koné, l’ancien militaire devenu le premier maraîcher bio de Côte d’Ivoire&amp;#039;], [&amp;#039;2021-04-20 11:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Amadou Koné, l’ancien militaire devenu le premier maraîcher bio de Côte d’Ivoire&amp;#039;, &amp;#039;2021-04-20 11:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/afrique/article/2021/04/20/amadou-kone-l-ancien-militaire-devenu-le-premier-maraicher-bio-de-cote-d-ivoire_6077418_3212.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bde00&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/afrique/article/2021/04/23/en-france-les-avocats-s-emparent-du-rapport-duclert-sur-le-rwanda_6077785_3212.html&lt;br /&gt;
[[&amp;#039;En France, les avocats s’emparent du rapport Duclert sur le Rwanda&amp;#039;], [&amp;#039;2021-04-23 10:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;En France, les avocats s’emparent du rapport Duclert sur le Rwanda&amp;#039;, &amp;#039;2021-04-23 10:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/afrique/article/2021/04/23/en-france-les-avocats-s-emparent-du-rapport-duclert-sur-le-rwanda_6077785_3212.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bde50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/blog/realitesbiomedicales/2021/04/22/covid-19-ce-quon-sait-et-ce-quon-ignore-sur-le-variant-indien/&lt;br /&gt;
[[], []]&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bd4f0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/sport/article/2021/04/24/ligue-1-avant-lyon-lille-le-psg-reprend-la-tete-du-classement_6077947_3242.html&lt;br /&gt;
[[&amp;#039;Ligue 1\xa0: avant Lyon-Lille, le PSG reprend la tête du classement&amp;#039;], [&amp;#039;2021-04-24 17:41:26&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Ligue 1 : avant Lyon-Lille, le PSG reprend la tête du classement&amp;#039;, &amp;#039;2021-04-24 17:41:26&amp;#039;, &amp;#039;https://www.lemonde.fr/sport/article/2021/04/24/ligue-1-avant-lyon-lille-le-psg-reprend-la-tete-du-classement_6077947_3242.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bd360&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/disparitions/article/2021/04/25/philippe-herreman-ancien-journaliste-au-monde-est-mort_6078015_3382.html&lt;br /&gt;
[[&amp;#039;Philippe Herreman, ancien journaliste au «\xa0Monde\xa0», est mort&amp;#039;], [&amp;#039;2021-04-25 16:23:05&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Philippe Herreman, ancien journaliste au « Monde », est mort&amp;#039;, &amp;#039;2021-04-25 16:23:05&amp;#039;, &amp;#039;https://www.lemonde.fr/disparitions/article/2021/04/25/philippe-herreman-ancien-journaliste-au-monde-est-mort_6078015_3382.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
monzir@MBP-de-Geoffroy 22-04-21 %&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde.png&amp;diff=4981</id>
		<title>Fichier:Mndr test lemonde.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr_test_lemonde.png&amp;diff=4981"/>
		<updated>2021-04-25T16:38:02Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4980</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4980"/>
		<updated>2021-04-25T16:36:39Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Résultats obtenus après lancement via le terminal :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Last login: Sun Apr 25 18:34:37 on ttys000&lt;br /&gt;
/Users/monzir/.zprofile:source:1: no such file or directory: /Users/monzir/.profile&lt;br /&gt;
monzir@MBP-de-Geoffroy ~ % cd /Users/monzir/Desktop/erg/Cours/Programmation/22-04-21&lt;br /&gt;
monzir@MBP-de-Geoffroy 22-04-21 % python3 lemonde.py&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2745e50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/disparitions/article/2021/04/25/mort-du-createur-de-mode-alber-elbaz-ancien-styliste-de-la-maison-lanvin_6077993_3382.html&lt;br /&gt;
[[&amp;#039;Mort du créateur de mode Alber Elbaz, ancien directeur artistique de la maison Lanvin&amp;#039;], [&amp;#039;2021-04-25 11:13:16&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Mort du créateur de mode Alber Elbaz, ancien directeur artistique de la maison Lanvin&amp;#039;, &amp;#039;2021-04-25 11:13:16&amp;#039;, &amp;#039;https://www.lemonde.fr/disparitions/article/2021/04/25/mort-du-createur-de-mode-alber-elbaz-ancien-styliste-de-la-maison-lanvin_6077993_3382.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789d60&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/scepticisme-des-opposants-au-regime-militaire-apres-le-sommet-de-l-asean-sur-la-birmanie_6078009_3210.html&lt;br /&gt;
[[&amp;#039;Scepticisme des opposants au régime militaire après le sommet de l’Asean sur la Birmanie&amp;#039;], [&amp;#039;2021-04-25 14:44:26&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Scepticisme des opposants au régime militaire après le sommet de l’Asean sur la Birmanie&amp;#039;, &amp;#039;2021-04-25 14:44:26&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/scepticisme-des-opposants-au-regime-militaire-apres-le-sommet-de-l-asean-sur-la-birmanie_6078009_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27897c0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/23/hotel-seances-numeriques-lieux-ephemeres-le-cinema-se-reinvente-en-temps-de-covid_6077829_4500055.html&lt;br /&gt;
[[&amp;#039;Hôtel, séances numériques, lieux éphémères… Le cinéma se réinvente en temps de Covid&amp;#039;], [&amp;#039;2021-04-23 15:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Hôtel, séances numériques, lieux éphémères… Le cinéma se réinvente en temps de Covid&amp;#039;, &amp;#039;2021-04-23 15:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/23/hotel-seances-numeriques-lieux-ephemeres-le-cinema-se-reinvente-en-temps-de-covid_6077829_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789c20&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/23/en-tunisie-les-nouveaux-visages-de-la-colere_6077721_4500055.html&lt;br /&gt;
[[&amp;#039;En Tunisie, les nouveaux visages de la colère&amp;#039;], [&amp;#039;2021-04-22 23:45:02&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;En Tunisie, les nouveaux visages de la colère&amp;#039;, &amp;#039;2021-04-22 23:45:02&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/23/en-tunisie-les-nouveaux-visages-de-la-colere_6077721_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2789d60&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/vanessa-codaccioni-les-policiers-incarnent-le-monopole-de-la-violence-physique-legitime-de-l-etat_6078000_3224.html&lt;br /&gt;
[[&amp;#039;Vanessa Codaccioni\xa0: «\xa0Les policiers incarnent le monopole de la violence physique légitime de l’Etat\xa0»&amp;#039;], [&amp;#039;2021-04-25 13:00:12&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Vanessa Codaccioni : « Les policiers incarnent le monopole de la violence physique légitime de l’Etat »&amp;#039;, &amp;#039;2021-04-25 13:00:12&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/vanessa-codaccioni-les-policiers-incarnent-le-monopole-de-la-violence-physique-legitime-de-l-etat_6078000_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796ef0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/attaque-de-rambouillet-le-procureur-antiterroriste-evoque-une-radicalisation-peu-contestable-et-des-troubles-de-la-personnalite_6077992_3224.html&lt;br /&gt;
[[&amp;#039;Attaque de Rambouillet\xa0: le procureur antiterroriste évoque «\xa0une radicalisation peu contestable\xa0» et «\xa0des troubles de la personnalité\xa0»&amp;#039;], [&amp;#039;2021-04-25 10:57:46&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Attaque de Rambouillet : le procureur antiterroriste évoque « une radicalisation peu contestable » et « des troubles de la personnalité »&amp;#039;, &amp;#039;2021-04-25 10:57:46&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/attaque-de-rambouillet-le-procureur-antiterroriste-evoque-une-radicalisation-peu-contestable-et-des-troubles-de-la-personnalite_6077992_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796f90&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/sport/article/2021/04/25/cyclisme-tadej-pogacar-devance-julian-alaphilippe-et-remporte-la-course-liege-bastogne-liege_6078011_3242.html&lt;br /&gt;
[[&amp;#039;Cyclisme\xa0: Tadej Pogacar devance Julian Alaphilippe et remporte la course Liège-Bastogne-Liège&amp;#039;], [&amp;#039;2021-04-25 15:40:41&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Cyclisme : Tadej Pogacar devance Julian Alaphilippe et remporte la course Liège-Bastogne-Liège&amp;#039;, &amp;#039;2021-04-25 15:40:41&amp;#039;, &amp;#039;https://www.lemonde.fr/sport/article/2021/04/25/cyclisme-tadej-pogacar-devance-julian-alaphilippe-et-remporte-la-course-liege-bastogne-liege_6078011_3242.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa2796630&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/societe/article/2021/04/25/la-joie-et-le-soulagement-des-feministes-qui-se-decouvrent-lesbiennes_6077968_3224.html&lt;br /&gt;
[[&amp;#039;La «\xa0joie\xa0» et le «\xa0soulagement\xa0» des féministes qui se «\xa0découvrent\xa0» lesbiennes&amp;#039;], [&amp;#039;2021-04-25 05:00:07&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;La « joie » et le « soulagement » des féministes qui se « découvrent » lesbiennes&amp;#039;, &amp;#039;2021-04-25 05:00:07&amp;#039;, &amp;#039;https://www.lemonde.fr/societe/article/2021/04/25/la-joie-et-le-soulagement-des-feministes-qui-se-decouvrent-lesbiennes_6077968_3224.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27963b0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/indonesie-le-sous-marin-disparu-au-large-de-bali-retrouve-aucun-survivant-parmi-les-53-membres-d-equipage_6077998_3210.html&lt;br /&gt;
[[&amp;#039;Indonésie\xa0: le sous-marin disparu au large de Bali retrouvé, aucun survivant parmi les 53 membres d’équipage&amp;#039;], [&amp;#039;2021-04-25 12:23:17&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Indonésie : le sous-marin disparu au large de Bali retrouvé, aucun survivant parmi les 53 membres d’équipage&amp;#039;, &amp;#039;2021-04-25 12:23:17&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/indonesie-le-sous-marin-disparu-au-large-de-bali-retrouve-aucun-survivant-parmi-les-53-membres-d-equipage_6077998_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a4cc0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/international/article/2021/04/25/irak-un-incendie-dans-une-unite-de-soins-pour-malades-du-covid-19-fait-au-moins-vingt-trois-morts_6077958_3210.html&lt;br /&gt;
[[&amp;#039;Irak\xa0: un incendie dans un hôpital de Bagdad fait au moins 82\xa0morts, le ministre de la santé suspendu&amp;#039;], [&amp;#039;2021-04-24 23:46:23&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Irak : un incendie dans un hôpital de Bagdad fait au moins 82 morts, le ministre de la santé suspendu&amp;#039;, &amp;#039;2021-04-24 23:46:23&amp;#039;, &amp;#039;https://www.lemonde.fr/international/article/2021/04/25/irak-un-incendie-dans-une-unite-de-soins-pour-malades-du-covid-19-fait-au-moins-vingt-trois-morts_6077958_3210.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a48b0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/m-le-mag/article/2021/04/25/carton-rouge-du-foot-allemand-contre-l-homophobie-de-viktor-orban_6077966_4500055.html&lt;br /&gt;
[[&amp;#039;Carton rouge du foot allemand contre l’homophobie de Viktor Orbán&amp;#039;], [&amp;#039;2021-04-25 04:00:11&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Carton rouge du foot allemand contre l’homophobie de Viktor Orbán&amp;#039;, &amp;#039;2021-04-25 04:00:11&amp;#039;, &amp;#039;https://www.lemonde.fr/m-le-mag/article/2021/04/25/carton-rouge-du-foot-allemand-contre-l-homophobie-de-viktor-orban_6077966_4500055.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27a4ae0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/economie/article/2021/04/24/le-palladium-gonfle-a-l-helium_6077878_3234.html&lt;br /&gt;
[[&amp;#039;Le palladium gonflé à l’hélium&amp;#039;], [&amp;#039;2021-04-23 22:58:49&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Le palladium gonflé à l’hélium&amp;#039;, &amp;#039;2021-04-23 22:58:49&amp;#039;, &amp;#039;https://www.lemonde.fr/economie/article/2021/04/24/le-palladium-gonfle-a-l-helium_6077878_3234.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27ace50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/24/affaire-sarah-halimi-l-absence-de-discernement-est-peut-etre-la-signature-meme-du-demon-antisemite_6077891_3232.html&lt;br /&gt;
[[&amp;#039;Affaire Sarah Halimi: «\xa0L’absence de discernement est peut-être la signature même du démon antisémite\xa0»&amp;#039;], [&amp;#039;2021-04-24 04:30:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Affaire Sarah Halimi: « L’absence de discernement est peut-être la signature même du démon antisémite »&amp;#039;, &amp;#039;2021-04-24 04:30:14&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/24/affaire-sarah-halimi-l-absence-de-discernement-est-peut-etre-la-signature-meme-du-demon-antisemite_6077891_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27acef0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/23/super-ligue-les-supporteurs-veulent-retrouver-le-sens-de-la-surprise-et-renouer-avec-la-tradition-d-un-football-spectaculaire-et-festif_6077836_3232.html&lt;br /&gt;
[[&amp;#039;Super Ligue\xa0:\xa0«\xa0Les supporteurs veulent retrouver le sens de la surprise et renouer avec la tradition d’un football spectaculaire et festif\xa0»&amp;#039;], [&amp;#039;2021-04-23 16:00:18&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Super Ligue : « Les supporteurs veulent retrouver le sens de la surprise et renouer avec la tradition d’un football spectaculaire et festif »&amp;#039;, &amp;#039;2021-04-23 16:00:18&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/23/super-ligue-les-supporteurs-veulent-retrouver-le-sens-de-la-surprise-et-renouer-avec-la-tradition-d-un-football-spectaculaire-et-festif_6077836_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27aca40&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/25/l-approche-one-health-restera-longtemps-un-instrument-de-communication-politique-plutot-qu-un-levier-d-action_6078014_3232.html&lt;br /&gt;
[[&amp;#039;«\xa0L’approche “One Health” restera longtemps un instrument de communication politique plutôt qu’un levier d’action\xa0»&amp;#039;], [&amp;#039;2021-04-25 16:00:39&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;« L’approche “One Health” restera longtemps un instrument de communication politique plutôt qu’un levier d’action »&amp;#039;, &amp;#039;2021-04-25 16:00:39&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/25/l-approche-one-health-restera-longtemps-un-instrument-de-communication-politique-plutot-qu-un-levier-d-action_6078014_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27ac1d0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/idees/article/2021/04/25/maria-negreponti-delivanis-la-grece-doit-crier-a-la-face-du-monde-qu-elle-a-le-droit-d-annuler-immediatement-sa-dette_6078016_3232.html&lt;br /&gt;
[[&amp;#039;Maria Negreponti-Delivanis\xa0: «\xa0La Grèce doit crier à la face du monde qu’elle a le droit d’annuler immédiatement sa dette\xa0»&amp;#039;], [&amp;#039;2021-04-25 16:30:13&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Maria Negreponti-Delivanis : « La Grèce doit crier à la face du monde qu’elle a le droit d’annuler immédiatement sa dette »&amp;#039;, &amp;#039;2021-04-25 16:30:13&amp;#039;, &amp;#039;https://www.lemonde.fr/idees/article/2021/04/25/maria-negreponti-delivanis-la-grece-doit-crier-a-la-face-du-monde-qu-elle-a-le-droit-d-annuler-immediatement-sa-dette_6078016_3232.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3c20&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-le-pen-fidelise-ses-soutiens-malgre-la-grande-mobilite-electorale_6077924_823448.html&lt;br /&gt;
[[&amp;#039;Présidentielle 2022 : Marine Le Pen fidélise ses soutiens malgré la grande mobilité électorale&amp;#039;], [&amp;#039;2021-04-24 10:04:01&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Présidentielle 2022 : Marine Le Pen fidélise ses soutiens malgré la grande mobilité électorale&amp;#039;, &amp;#039;2021-04-24 10:04:01&amp;#039;, &amp;#039;https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-le-pen-fidelise-ses-soutiens-malgre-la-grande-mobilite-electorale_6077924_823448.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3bd0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-xavier-bertrand-emerge-mais-fait-face-a-de-nombreux-defis_6077925_823448.html&lt;br /&gt;
[[&amp;#039;Présidentielle 2022\xa0: Xavier Bertrand émerge mais fait face à de nombreux défis&amp;#039;], [&amp;#039;2021-04-24 10:04:21&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Présidentielle 2022 : Xavier Bertrand émerge mais fait face à de nombreux défis&amp;#039;, &amp;#039;2021-04-24 10:04:21&amp;#039;, &amp;#039;https://www.lemonde.fr/politique/article/2021/04/24/presidentielle-2022-xavier-bertrand-emerge-mais-fait-face-a-de-nombreux-defis_6077925_823448.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27b3360&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/afrique/article/2021/04/20/amadou-kone-l-ancien-militaire-devenu-le-premier-maraicher-bio-de-cote-d-ivoire_6077418_3212.html&lt;br /&gt;
[[&amp;#039;Amadou Koné, l’ancien militaire devenu le premier maraîcher bio de Côte d’Ivoire&amp;#039;], [&amp;#039;2021-04-20 11:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Amadou Koné, l’ancien militaire devenu le premier maraîcher bio de Côte d’Ivoire&amp;#039;, &amp;#039;2021-04-20 11:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/afrique/article/2021/04/20/amadou-kone-l-ancien-militaire-devenu-le-premier-maraicher-bio-de-cote-d-ivoire_6077418_3212.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bde00&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/afrique/article/2021/04/23/en-france-les-avocats-s-emparent-du-rapport-duclert-sur-le-rwanda_6077785_3212.html&lt;br /&gt;
[[&amp;#039;En France, les avocats s’emparent du rapport Duclert sur le Rwanda&amp;#039;], [&amp;#039;2021-04-23 10:00:14&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;En France, les avocats s’emparent du rapport Duclert sur le Rwanda&amp;#039;, &amp;#039;2021-04-23 10:00:14&amp;#039;, &amp;#039;https://www.lemonde.fr/afrique/article/2021/04/23/en-france-les-avocats-s-emparent-du-rapport-duclert-sur-le-rwanda_6077785_3212.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bde50&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/blog/realitesbiomedicales/2021/04/22/covid-19-ce-quon-sait-et-ce-quon-ignore-sur-le-variant-indien/&lt;br /&gt;
[[], []]&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bd4f0&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/sport/article/2021/04/24/ligue-1-avant-lyon-lille-le-psg-reprend-la-tete-du-classement_6077947_3242.html&lt;br /&gt;
[[&amp;#039;Ligue 1\xa0: avant Lyon-Lille, le PSG reprend la tête du classement&amp;#039;], [&amp;#039;2021-04-24 17:41:26&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Ligue 1 : avant Lyon-Lille, le PSG reprend la tête du classement&amp;#039;, &amp;#039;2021-04-24 17:41:26&amp;#039;, &amp;#039;https://www.lemonde.fr/sport/article/2021/04/24/ligue-1-avant-lyon-lille-le-psg-reprend-la-tete-du-classement_6077947_3242.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
&amp;lt;Element html at 0x7fafa27bd360&amp;gt;&lt;br /&gt;
https://www.lemonde.fr/disparitions/article/2021/04/25/philippe-herreman-ancien-journaliste-au-monde-est-mort_6078015_3382.html&lt;br /&gt;
[[&amp;#039;Philippe Herreman, ancien journaliste au «\xa0Monde\xa0», est mort&amp;#039;], [&amp;#039;2021-04-25 16:23:05&amp;#039;]]&lt;br /&gt;
INSERT INTO article (titre, date_crea, url, source_id) VALUES (&amp;#039;Philippe Herreman, ancien journaliste au « Monde », est mort&amp;#039;, &amp;#039;2021-04-25 16:23:05&amp;#039;, &amp;#039;https://www.lemonde.fr/disparitions/article/2021/04/25/philippe-herreman-ancien-journaliste-au-monde-est-mort_6078015_3382.html&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
monzir@MBP-de-Geoffroy 22-04-21 %&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4979</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4979"/>
		<updated>2021-04-25T16:31:18Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source [https://www.lemonde.fr/(lemonde.fr)] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4978</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4978"/>
		<updated>2021-04-25T16:30:59Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr[https://www.lemonde.fr/]) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source [https://www.lemonde.fr/(lemonde.fr)]&amp;#039;&amp;#039;&amp;#039; ==&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4977</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4977"/>
		<updated>2021-04-25T16:30:33Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source ([https://www.lemonde.fr/]lemonde.fr) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source (lemonde.fr[https://www.lemonde.fr/])&amp;#039;&amp;#039;&amp;#039; ==&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4976</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4976"/>
		<updated>2021-04-25T16:30:16Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source ([lemonde.fr]https://www.lemonde.fr/) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source ([https://www.lemonde.fr/]lemonde.fr)&amp;#039;&amp;#039;&amp;#039; ==&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4975</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4975"/>
		<updated>2021-04-25T16:29:24Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* 11.03.21 : Travail en binôme avec Lea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Test de récupération de données et d&amp;#039;insertion dans la base de données avec une source ([lemonde.fr]https://www.lemonde.fr/)&amp;#039;&amp;#039;&amp;#039; ==&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4974</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4974"/>
		<updated>2021-04-25T16:27:42Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* 11.03.21 : travail en binôme avec Lea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : Travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4973</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4973"/>
		<updated>2021-04-25T16:27:22Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== Définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ecrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21 : travail en binôme avec [http://curlybraces.be/wiki/Lea Lea]&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4972</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4972"/>
		<updated>2021-04-25T16:24:40Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma et de la base de données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4971</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4971"/>
		<updated>2021-04-25T16:24:02Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Mise à jour du schéma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma et de la base de données&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-bdd-tables.png]]&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-bdd-tables.png&amp;diff=4970</id>
		<title>Fichier:Mndr-bdd-tables.png</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Fichier:Mndr-bdd-tables.png&amp;diff=4970"/>
		<updated>2021-04-25T16:22:58Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4969</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4969"/>
		<updated>2021-04-25T16:07:57Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;À partir de là, il est possible de récupérer les données et de les envoyer à la base de données pour qu&amp;#039;elles soient classées selon les critères retenus : la source et son ID, l&amp;#039;url de l&amp;#039;article et son ID, le titre de l&amp;#039;article et la date de publication&amp;#039;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4968</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4968"/>
		<updated>2021-04-25T16:04:02Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi faire avec le contenus des éléments HTML visés et uniformisation du format de date et heure de publication&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#1: Définir l&amp;#039;opération getData&lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
#2: déclarer un tableau vide&lt;br /&gt;
    data = []&lt;br /&gt;
#3: pour chaque élément dans htmlElements:&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
#4: SI (condition) l&amp;#039;opération consiste à récupérer l&amp;#039;attribut href:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
#4bis: stocker la valeur de l&amp;#039;attribut href dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
#5: aussi, si l&amp;#039;operation consiste à récupérer la date:&lt;br /&gt;
        elif operation == &amp;#039;get_content_date&amp;#039;:&lt;br /&gt;
            #2021-04-19T10:09:10+00:00&lt;br /&gt;
            #2021-04-19 10:09:10&lt;br /&gt;
#6: déclarer une fonction &amp;quot;date&amp;quot; qui consiste à récupérer le contenu visé:&lt;br /&gt;
            date = element.get(&amp;#039;content&amp;#039;)&lt;br /&gt;
#7: remplacer le caractère &amp;quot;T&amp;quot; au milieu de la châine par un espace pour le supprimer:&lt;br /&gt;
            date = date.replace(&amp;#039;T&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
#8: ?&lt;br /&gt;
            date = date[0:19]&lt;br /&gt;
#9: stocker la chaîne de caractère qui représente la date dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(date)&lt;br /&gt;
#9.1: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de text_content:&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
#9.2: stocker la valeur de text_content dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
#9.3: ou sinon, si l&amp;#039;opération consiste à récupérer la valeur de datetime:&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
#9.4: stocker la valeur de datetime dans le tableau &amp;quot;data&amp;quot;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
#10: retourne la donnée récupérée&lt;br /&gt;
    return data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4958</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4958"/>
		<updated>2021-04-25T15:35:20Z</updated>

		<summary type="html">&lt;p&gt;Mondher : /* Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs. À cette étape, on stocke les données dans un tableau (dataArticle) qui sera en relation avec la base de données, dans laquelle les données seront classées comme dans le tableau dataArticle.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4956</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4956"/>
		<updated>2021-04-25T15:32:26Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Déroulement des opérations sur le site d&amp;#039;une source et stockage des données dans un tableau&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4953</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4953"/>
		<updated>2021-04-25T15:28:28Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #print(urlArticle)&lt;br /&gt;
        sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
        print(sourceUrl)&lt;br /&gt;
        print(urlArticle)&lt;br /&gt;
        #print(sourceUrl)&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
        dataArticle = []&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
            # print(applySelector)&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
            dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4952</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4952"/>
		<updated>2021-04-25T15:26:36Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
for source in selecteurs:&lt;br /&gt;
    #0:récupérer l&amp;#039;id de la source dans la base de données&lt;br /&gt;
    sourceId = source[&amp;#039;source_id&amp;#039;]&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    premierePage = getSrcFromURL(source[&amp;#039;url&amp;#039;])&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    liensArticles = getResults(premierePage, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    urlsArticles = getData(liensArticles, source[&amp;#039;selecteur_links&amp;#039;][&amp;#039;operation&amp;#039;])&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
    for urlArticle in urlsArticles:&lt;br /&gt;
     5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
     print(urlArticle)&lt;br /&gt;
     sourceUrl = getSrcFromURL(urlArticle)&lt;br /&gt;
     print(sourceUrl)&lt;br /&gt;
     print(urlArticle)&lt;br /&gt;
     print(sourceUrl)&lt;br /&gt;
     #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db -&amp;gt; dataArticle&lt;br /&gt;
     dataArticle = []&lt;br /&gt;
     #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
        for selecteur_article in source[&amp;#039;selecteurs_article&amp;#039;]:&lt;br /&gt;
        #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
        applySelector = getResults(sourceUrl, selecteur_article[&amp;#039;selecteur&amp;#039;])&lt;br /&gt;
        print(applySelector)&lt;br /&gt;
        #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
        operateelement = getData(applySelector, selecteur_article[&amp;#039;operation&amp;#039;])&lt;br /&gt;
        #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        dataArticle.append(operateelement)&lt;br /&gt;
        print(dataArticle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4951</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4951"/>
		<updated>2021-04-25T15:21:36Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
  #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
	<entry>
		<id>https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4950</id>
		<title>Mondher</title>
		<link rel="alternate" type="text/html" href="https://curlybraces.be/wiki/index.php?title=Mondher&amp;diff=4950"/>
		<updated>2021-04-25T15:21:07Z</updated>

		<summary type="html">&lt;p&gt;Mondher : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Hello !==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;travail en cours : ranking de termes médiatiques&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:indice.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Quoi ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une page web affiche un ranking en temps réel des termes utilisés dans les articles d&amp;#039;une sélection de médias de Suisse romande.&lt;br /&gt;
Pour une sélection de sites internets, un classement des X mots les plus utilisés est présenté sous la forme d&amp;#039;un tableau de type indice boursier, avec les gains et les pertes en pourcentages de chaque terme.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Comment ?&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
=== 1/ définir les sources ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une sélection de quatorze journaux suisse-romands a été retenue. Cette sélection contient la totalité des quotidiens de la partie francophone de Suisse; chaque canton est représenté. Les critères de sélection sont les suivants : le journal doit être un quotidien suisse-romand, il doit être francophone, il doit traiter de l’actualité internationale, nationale et cantonale et il doit diffuser ses informations sur un site internet et/ou une application entre autre.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Sélection:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
·	24 heures (Canton de Vaud)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Tribune de Genève (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Temps (Canton de Genève)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Liberté (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Gruyère (Canton de Fribourg)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Nouvelliste (Canton du Valais)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Arc Info (Canton de Neuchâtel)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Journal du Jura (partie francophone du Canton de Berne)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Quotidien jurassien (Canton du Jura)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Côte (Région lémanique)&amp;lt;br&amp;gt;&lt;br /&gt;
·	La Région (Région Nord-vaudoise)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Courrier (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	Le Matin (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
·	20 Minutes (Romandie)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;2/ diagramme de la base de données&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Une structure de base de données a été créée sur sur phpMyAdmin. La base de données est structurée en catégories et sous-catégories distinctes. Toute informations récoltée est triée et classée dans la catégorie adéquate. Il y a trois catégories et trois sous-catégories : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la catégorie article, le titre de l’article, son  header, son corps de texte, sa date de publication, sa date de modification (s’il y en a une), son url, sa source&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie source&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de la source , son nom et son url&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_aut·eur·ice&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie aut·eur·rice·s, l’ID de la sous-catégorie aut·eur·ice·s et l’ID des articles par aut·eur·rice·s&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie aut·eur·ice&amp;#039;&amp;#039;&amp;#039; regroupe l’ID de chaque aut·eur·rice·s, son nom, son  prénom et une courte bio (s’il y en a une)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—&amp;#039;&amp;#039;&amp;#039;La catégorie article_mots&amp;#039;&amp;#039;&amp;#039;: elle regroupe l’ID de la catégorie article_mots, l’ID de chaque article, l’ID de la sous-catégorie mots&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
—— &amp;#039;&amp;#039;&amp;#039;La sous-catégorie mots&amp;#039;&amp;#039;&amp;#039; : elle regroupe l’ID de chaque mot retenu et classé, le mot en  question et la valeur de sa fréquence d’apparition&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:diagramme_base_donnees_.jpg]] &amp;#039;&amp;#039;Schéma de la structure de la base de données&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- phpMyAdmin SQL Dump&lt;br /&gt;
-- version 4.9.5&lt;br /&gt;
-- https://www.phpmyadmin.net/&lt;br /&gt;
--&lt;br /&gt;
-- Host: localhost:8889&lt;br /&gt;
-- Generation Time: Feb 25, 2021 at 08:43 AM&lt;br /&gt;
-- Server version: 5.7.30&lt;br /&gt;
-- PHP Version: 7.4.9&lt;br /&gt;
&lt;br /&gt;
SET SQL_MODE = &amp;quot;NO_AUTO_VALUE_ON_ZERO&amp;quot;;&lt;br /&gt;
SET time_zone = &amp;quot;+00:00&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;&lt;br /&gt;
/*!40101 SET NAMES utf8mb4 */;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Database: `indice_popularité_termes`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `titre` text NOT NULL,&lt;br /&gt;
  `header` text NOT NULL,&lt;br /&gt;
  `body` text NOT NULL,&lt;br /&gt;
  `date_crea` datetime NOT NULL,&lt;br /&gt;
  `date_modif` datetime NOT NULL,&lt;br /&gt;
  `url` text NOT NULL,&lt;br /&gt;
  `source_id` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Dumping data for table `article`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
INSERT INTO `article` (`id`, `titre`, `header`, `body`, `date_crea`, `date_modif`, `url`, `source_id`) VALUES&lt;br /&gt;
(1, &amp;#039;1&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;3&amp;#039;, &amp;#039;2020-10-07 12:11:40&amp;#039;, &amp;#039;2020-10-14 12:11:40&amp;#039;, &amp;#039;4&amp;#039;, 4);&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_auteur` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_auteurice` int(10) UNSIGNED NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `article_mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `id_article` int(11) NOT NULL,&lt;br /&gt;
  `id_mots` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `aut-eur-rice` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `prénom` text NOT NULL,&lt;br /&gt;
  `bio` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `mots`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `mots` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `mots` text NOT NULL,&lt;br /&gt;
  `fréquence` int(11) NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Table structure for table `source`&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE `source` (&lt;br /&gt;
  `id` int(10) UNSIGNED NOT NULL,&lt;br /&gt;
  `nom` text NOT NULL,&lt;br /&gt;
  `url` text NOT NULL&lt;br /&gt;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Indexes for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  ADD PRIMARY KEY (`id`);&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for dumped tables&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_auteur`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_auteur`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `article_mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `article_mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `aut-eur-rice`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `aut-eur-rice`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `mots`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `mots`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- AUTO_INCREMENT for table `source`&lt;br /&gt;
--&lt;br /&gt;
ALTER TABLE `source`&lt;br /&gt;
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;&lt;br /&gt;
&lt;br /&gt;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;&lt;br /&gt;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;&lt;br /&gt;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3/ écrire un programme (en python) pour récolter et stocker les informations contenues dans certains sélecteurs css :===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. repère et pointe les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; qui contiennent les informations nécessaires&amp;lt;br&amp;gt;&lt;br /&gt;
2. initialise un objet &amp;quot;navigateur&amp;quot; pour se connecter au site web à l&amp;#039;aide de la librairie &amp;#039;&amp;#039;mechanize&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
3. contourne une éventuelle demande de certificat de sécurité &amp;#039;&amp;#039;ssl&amp;#039;&amp;#039; pour accéder au contenu de la page&amp;lt;br&amp;gt;&lt;br /&gt;
4. extrait les données de la page web contenues dans les sélecteurs &amp;#039;&amp;#039;css&amp;#039;&amp;#039; ciblés&amp;lt;br&amp;gt;&lt;br /&gt;
5. lit les données&amp;lt;br&amp;gt;&lt;br /&gt;
6. encode les données en &amp;#039;&amp;#039;utf-8&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
7. récupère le contenu des sélecteurs css et les traduit en expressions &amp;#039;&amp;#039;xpath&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
8. print les informations&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:schema_indice_p.png]] &amp;#039;&amp;#039;Schéma du processus&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== Test du programme ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Page cible &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Code &amp;lt;br&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 à partir d&amp;#039;une page d&amp;#039;article de 24heures.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;
#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.24heures.ch/les-cours-en-ligne-engendrent-des-inegalites-800936194846&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, article h2, article h3, article p, article time&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;
        print(resultat.text_content())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Lancement du programme dans le terminal&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-test-launch.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Tentative de tri du texte avec des regex et de comptage de l&amp;#039;occurrence des mots ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:mndr-reg-1.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-2.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-3.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-4.jpg]]&lt;br /&gt;
[[Fichier:mndr-reg-5.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Le résultat est pas trop mal. J&amp;#039;aimerais maintenant comprendre faire pour garder des mots composés comme &amp;quot;en ligne&amp;quot; et aussi comment rendre cette opération plus efficace et l&amp;#039;inclure dans le programme dans Python..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Mndr-python-count-1.jpg]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= &amp;#039;&amp;#039;&amp;#039;11.03.21&amp;#039;&amp;#039;&amp;#039; =&lt;br /&gt;
À partir du 11.03, travail en binôme avec [http://curlybraces.be/wiki/Lea Lea].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Étant donné qu&amp;#039;un certain nombre de journaux fonctionnent par abonnement et que, du coup, on a pas toujours accès au corps des articles, on a choisi de se concentrer sur les titres de ces articles. On récupère alors les titres, la source et la date de publication.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
On a aussi étendu géographiquement la sélection de journaux. On retient les quotidiens nationaux de Belgique, de Suisse, de France, du Luxembourg et de Monaco, qui ont une présence sur le net :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour de la liste de quotidiens retenus&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Belgique&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesoir.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lecho.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lalibre.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://fr.metrotime.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suisse&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.24heures.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lematin.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lenouvelliste.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.tdg.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.arcinfo.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.heidi.news&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lacote.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lecourrier.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.letemps.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.agefi.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lqj.ch&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
France&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lefigaro.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lemonde.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lesechos.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.leparisien.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.liberation.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.la-croix.com&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lequipe.fr&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.dhnet.be&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luxembourg&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://www.lessentiel.lu/fr/luxembourg/&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://lequotidien.lu&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Monaco&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
https://www.monacomatin.mc&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;#039;&amp;#039;&amp;#039;Mise à jour du schéma&amp;#039;&amp;#039;&amp;#039; ==&lt;br /&gt;
[[Fichier:mndr-iptm-schema.png]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== &amp;#039;&amp;#039;&amp;#039;Tableaux et dictionnaires : un code unique qui regroupe toutes les sources et leurs sélecteurs&amp;#039;&amp;#039;&amp;#039; ===&lt;br /&gt;
Afin d&amp;#039;avoir un unique code global dans lequel toutes les sources sont regroupées, on a vu l&amp;#039;utilisation de tableaux et de dictionnaires. Le tableau &amp;#039;&amp;#039;selecteurs&amp;#039;&amp;#039; contient les sources sous forme de dictionnaires répertoriant les sélecteurs nécessaires à la récupération des données visées (url de la source, url de l&amp;#039;article, titre de l&amp;#039;article et date de création de l&amp;#039;article).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:&amp;#039;h1 a&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:{&lt;br /&gt;
            &amp;#039;titre&amp;#039;:&amp;#039;article h1&amp;#039;,&lt;br /&gt;
            &amp;#039;date_pub&amp;#039;:&amp;#039;span.date_pub&amp;#039;,&lt;br /&gt;
            &amp;#039;date_modif&amp;#039;:&amp;#039;span.date_modif&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
 &lt;br /&gt;
print(selecteurs[0][&amp;#039;selecteurs_article&amp;#039;][&amp;#039;date_pub&amp;#039;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
À partir de là, le code se présente comme cela :&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import time&lt;br /&gt;
import mechanize&lt;br /&gt;
import lxml.html as lh&lt;br /&gt;
import cssselect&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def getSrcFromURL(url):&lt;br /&gt;
    data = br.open(url)&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;
    return src&lt;br /&gt;
 &lt;br /&gt;
def getResults(src, selecteurs):&lt;br /&gt;
    results = []&lt;br /&gt;
    cssSelectSelecteurs = cssselect.parse(selecteurs)&lt;br /&gt;
    for cssSelectSelecteur in cssSelectSelecteurs:&lt;br /&gt;
        chemin_xpath = cssselect.HTMLTranslator().selector_to_xpath(cssSelectSelecteur, translate_pseudo_elements=True)&lt;br /&gt;
        results = results + src.xpath(chemin_xpath)&lt;br /&gt;
 &lt;br /&gt;
    return results&lt;br /&gt;
 &lt;br /&gt;
def getData(htmlElements, operation):&lt;br /&gt;
    data = []&lt;br /&gt;
    for element in htmlElements:&lt;br /&gt;
        if operation == &amp;#039;get_href&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;href&amp;#039;))&lt;br /&gt;
        elif operation == &amp;#039;text_content&amp;#039;:&lt;br /&gt;
            data.append(element.text_content())&lt;br /&gt;
        elif operation == &amp;#039;get_datetime&amp;#039;:&lt;br /&gt;
            data.append(element.get(&amp;#039;datetime&amp;#039;))&lt;br /&gt;
 &lt;br /&gt;
    return data&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
selecteurs = [&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lemonde.fr&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;div.article a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}  &lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;#039;url&amp;#039;:&amp;#039;http://lesoir.be&amp;#039;,&lt;br /&gt;
        &amp;#039;selecteur_links&amp;#039;:{&amp;#039;name&amp;#039;:&amp;#039;article_link&amp;#039;, &amp;#039;selecteur&amp;#039;:&amp;#039;h1 a&amp;#039;,&amp;#039;operation&amp;#039;:&amp;#039;get_href&amp;#039;},&lt;br /&gt;
        &amp;#039;selecteurs_article&amp;#039;:[&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;titre&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;article h1&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_pub&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_pub&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;},&lt;br /&gt;
            {&amp;#039;name&amp;#039;: &amp;#039;date_modif&amp;#039;, &amp;#039;selecteur&amp;#039;: &amp;#039;span.date_modif&amp;#039;, &amp;#039;operation&amp;#039;:&amp;#039;text_content&amp;#039;}&lt;br /&gt;
        ]&lt;br /&gt;
 &lt;br /&gt;
    }&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Maintenant que nous avons écrit la structure de données générale des sources, il faut renseigner quoi faire avec les données visées par les sélecteurs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
   #0: pour chaque source dans le tableau sélecteurs&lt;br /&gt;
    #1: récupérer la première page de la source&lt;br /&gt;
    #2: appliquer le sélecteur contenu dans &amp;#039;selecteur_links&amp;#039;&lt;br /&gt;
    #3: appliquer l&amp;#039;opération sur chaque élément récupéré -&amp;gt; url articles&lt;br /&gt;
    #4: pour chaque url article:&lt;br /&gt;
        #5: récupérer la source de la page désignée par l&amp;#039;url&lt;br /&gt;
        #6: déclarer un tableau vide qui contiendra les éléments à insérer dans la db &amp;quot;dataArticle&amp;quot;&lt;br /&gt;
        #7: pour chaque sélecteur contenu dans &amp;quot;selecteurs_article&amp;quot;:&lt;br /&gt;
            #8: appliquer le sélecteur article sur la source de la page&lt;br /&gt;
            #9: appliquer l&amp;#039;opération sur l&amp;#039;élément récupéré -&amp;gt; donnée&lt;br /&gt;
            #10: ajouter la donnée au tableau dataArticle&lt;br /&gt;
        #11: insérer le tableau dans la base de données&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mondher</name></author>
	</entry>
</feed>