Archives de l’auteur : Alexandre Hobeika

À propos Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

Une alternative à Word : écrire en RMarkdown

Billet écrit avec Florent Bédécarrats

Ce texte vise à présenter l’écriture en RMarkdown, une alternative à Word qui possède de nombreux avantages, dans un contexte actuel complexe pour l’édition scientifique. RMarkdown est une syntaxe, avec laquelle on peut écrire des textes structurés et les transformer ensuite en différents formats (PDF, .docx, HTML) à l’aide d’un logiciel, ici RStudio. Cette philosophie, qui dissocie le contenu du texte et sa mise en forme, est proche de celle de LaTeX, dont RMarkdown reprend les avantages et en évacue la plupart des défauts. De plus, écrire en RMarkdown permet d’intégrer des traitements effectués avec R, tout en favorisant la reproductibilité des calculs. En fin de compte, c’est une solution qui s’approche de la facilité d’utilisation de Word, tout en offrant des avantages nombreux.

Une première partie discute pourquoi l’utiliser, une seconde s’attache au comment. Alors qu’il existe de nombreux articles sur internet présentant la syntaxe RMarkdown, on entre ici dans le détail des coûts de transition en provenance de Word, et de la manière concrète de réaliser l’ensemble des opérations courantes d’écriture.

Pourquoi écrire en RMarkdown ?

L’édition scientifique fait aujourd’hui face à plusieurs transformations : réduction des budgets et des «personnels de renfort» éditoriaux, transition des supports vers le numérique, et crise de la reproductibilité des résultats. Chacune conduit à des évolutions des besoins des éditeurs, donc aussi par contrecoup des auteurs. Alors que Word est l’outil et le format standard pour les textes de sciences sociales depuis les années 1990, RMarkdown apparait mieux adapté à la situation contemporaine.

Quelques problèmes (techniques) de l’édition scientifique aujourd’hui

Depuis les années 1990, les outils de composition des textes se divisent en deux camps, dont les grandes figures sont Word et LaTeX. Le premier se caractérise par la composition directement visuelle du texte : on écrit et on voit, en le faisant, le résultat qui sera imprimé. Le second s’appuie au contraire sur l’idée d’une dissociation du fond et de la forme : en LaTeX, l’écriture s’effectue dans un fichier où on indique le texte et les instructions de mise en forme, et que l’on transforme ensuite en d’autres formats, souvent PDF, par un programme qui se charge de la mise en page. Le modèle Word s’est imposé dans les sciences sociales, le modèle LaTeX dans d’autres disciplines. Aujourd’hui un ensemble de problèmes amènent à remettre en cause cette partition et, nous concernant, l’hégémonie du modèle Word.

Réduction de la division du travail dans l’édition scientifique

Halbwachs noircissait des feuilles volantes, Pasteur des feuillets colorés, Proust collait ses paperolles, Wittgenstein écrivait à voix haute, Pasolini chérissait son Olivetti. Et des secrétaires, correcteurs, typographes, iconographes, éditeurs et imprimeurs en faisaient des livres.

L’édition d’avant les années 1990 apparaît aujourd’hui comme revelant d’un autre monde. Dans le domaine scientifique, une majorité de chercheurs écrivaient à la main, traçaient leurs graphiques sur papier millimétré, avant de transmettre leurs manuscrits à des secrétaires qui le dactylographiaient, transféraient les graphiques sur papier calque et devaient changer les touches de leur machine à écrire pour intégrer les formules mathématiques. Le tout étant copié en plusieurs exemplaires grâce à du papier carbone.

L’informatisation dans les sciences sociales, combinée au resserrement des budgets, a conduit à la fin de cette division du travail. Comme chaque auteur possède un ordinateur capable de réaliser toutes ces opérations, on attend de plus en plus qu’il réalise les tâches auparavant déléguées à ces personnels.

À ces problèmes d’organisation du travail, s’ajoutent ceux relatifs aux supports de publication. On se trouve au milieu d’une transition vers le web, sans que le papier soit nécessairement amené à disparaître. On doit donc gérer la coexistence de ces deux supports, qui sont structurés par des technologies de rendu différentes. Les revues de sciences sociales fonctionnent encore largement avec Word, et le formatage des articles, en particulier pour le web, leur demande, ainsi qu’aux auteurs, un travail de mise en forme effectué «manuellement» ou avec un convertisseur ad hoc. À l’inverse, le modèle LaTeX, qui sépare fond et forme, minimise le travail technique d’édition : comme le texte est séparé de sa mise en forme, et contient les indications de sa structure, il est aisé de le transformer en différents formats grâce à des programmes existants. Les revues fonctionnent avec des budgets toujours plus restreints pourraient donc être amenées à s’orienter vers des modèles plus économes en travail d’édition et de mise en page.

Crise de la reproductibilité et évolution des demandes des revues

Des débats plus épistémologiques, qui se sont cristallisés autour de la question de la reproductibilité, poussent également à des modifications des formats d’écriture demandés aux auteurs.

Ces dernières années, s’est développé un ensemble de critiques du processus de production des résultats scientifiques. La révision par les pairs, qui en est une institution centrale, a vu depuis le début des années 2010 sa fiabilité sérieusement remise en cause, d’abord en médecine, puis en psychologie, en économie et en sociologie. Si auparavant des résultats publiés ont pu être décriés comme frauduleux, et leurs auteurs pointés du doigt, la critique se porte désormais plus sur le processus de véridiction lui-même. Des enquêtes ont montré que la majorité des résultats publiés dans les revues de référence de ces disciplines ne pouvaient pas être reproduits. Ce problème est constitué en problème public, et fait l’objet de débats dans les grandes revues scientifiques ainsi que de rapports publics.

On distingue la reproductibilité empirique, l’obtention de mêmes données si on répète une expérience, de la reproductibilité analytique, obtenir des mêmes résultats si on fait les mêmes calculs. Une partie des réponses apportées jusqu’à maintenant consistent à modifier les pratiques éditoriales afin d’améliorer la reproductibilité analytique. Les revues d’économie, ou l’American Journal of Political Science, demandent désormais, lors de la soumission d’articles, à ce que l’auteur communique en même temps les données et les calculs effectués, pour que la revue puisse tenter de reproduire elle-même les résultats revendiqués.

S’il n’est pas certain qu’une couche supplémentaire de positivisme soit la solution ultime aux problèmes de ce monde, et si ces évolutions posent par ailleurs de nombreuses questions), ces demandes appellent néanmoins à ce que les fichiers transmis aux revues contiennent les calculs produisant les résultats revendiqués. Ceci est assez facile avec une écriture qui dissocie le fond et la forme, mais pas en Word.

Dissocier le fond et la forme – sans avoir à «programmer son texte»

Dans ce contexte, le modèle Word apparait de moins en moins bien adapté. La dissociation de la forme et du fond gagne au contraire en pertinence. Le modèle LaTeX est lourd, mais RMarkdown en possède les avantages sans la plupart des inconvénients.

Est-on si bien avec Word / LibreOffice ?

Le modèle Word a pour avantage l’apparence de la simplicité et de la facilité d’accès : on écrit, le résultat est immédiat. Cependant, pour les documents complexes comme les travaux scientifiques, cet attrait initial masque des difficultés que l’on doit bien souvent résoudre à la fin de l’écriture, rarement le moment idéal. Parmi les coûts cachés du modèle Word, on peut citer :

  • La mise aux normes typographiques : les doubles espaces, espaces insécables demi-espaces insécables avant les signes de ponctuation, etc., sont à vérifier soi-même
  • La table des matières : à re-valider à chaque modification du plan, et bien sûr besoin de structurer le texte
  • Les références à des figures, tableaux ou chapitres/sections, sont souvent écrites «à la main», et lourdes à modifier
  • Certains écrivent leur bibliographie à la main, parfois à la demande des revues
  • Sur certains systèmes, le logiciel est lent, et a du mal à traiter de gros fichiers

Le modèle LaTeX possède des avantages et inconvénients très différents.

Pourquoi ne pas écrire en LaTeX alors ?

Utiliser LaTeX permet de résoudre l’ensemble de ces problèmes. Les détails typographiques, comme la table des matières, les références croisées ou la bibliographie, sont pris en charge et générés automatiquement. La fin de l’écriture est beaucoup plus tranquille, et la mise en page est calculée pour se conformer à un ensemble de normes d’esthétique, ce qui rend les textes agréables à lire. Enfin, les fichiers de travail présentent l’avantage d’être en texte, donc très légers, universellement portables et robustes.

Les coûts d’utilisation de ce modèle se paient plutôt au début, à l’apprentissage. De plus, LaTeX présente les difficultés suivantes :

  • Ce n’est pas un logiciel mais un langage ; on doit utiliser deux logiciels, l’un pour écrire le texte, l’autre pour le mettre en page
  • On ne voit pas le résultat directement pendant l’écriture
  • Il faut écrire son texte comme un programme informatique, avec des balises un peu lourdes pour signaler les instructions de mise en forme
  • Les relectures et travail collaboratif passent par des PDF ou des versions papier, difficilement par le «suivi des modifications» type Word
  • Pour utiliser une nouvelle fonctionnalité, il faut chercher de l’aide dans les manuels ou sur internet

On comprend ainsi que ce modèle ne se soit pas imposé dans les sciences sociales françaises, en particulier dans la période d’informatisation des années 1990, où la tendance dominante était le retour de l’ethnographie, au terrain et aux «vrais gens», plutôt qu’un rapprochement avec les méthodes statistiques, la programmation et autres «truc de geek», devenus à la mode ces dernières années.

Notons au passage que dans les années 2000 a émergé un outil, LyX, qui se situe à mi-chemin entre LaTeX et RMarkdown. Il simplifie l’écriture d’un fichier LaTeX tout en proposant une interface avec des menus et une présentation du texte qui s’approche de la version finale. Il possède un ensemble d’extensions permettant de répondre à des besoins disciplinaires spécifiques (en linguistique par exemple). S’il est parfaitement utilisable en sciences sociales, il reste orienté vers l’impression papier, et garde certaines limitations comme l’écriture collaborative, la faible lisibilité brute des fichiers contenant le texte et les instructions de mise en page, et la publication sur le web.

RMarkdown : le meilleur des (deux) mondes ?

Écrire en RMarkdown offre, en revanche, un ensemble d’avantages de ces deux familles, tout en minimisant leurs inconvénients.

Tout d’abord cela demande moins de soin qu’en Word. Il faut seulement indiquer la structure du document, à savoir les titres, sous-titres, etc. Mais la typographie est prise en charge automatiquement : impossible de trouver dans le document final de double espace, de signe de ponctuation en début de ligne ; pas besoin non plus de se soucier de la table des matières, des renvois entre sections ou des références à des figures et tableaux. La prise en charge de ces aspects de mise en page permet de se concentrer sur l’écriture elle-même.

Ensuite, les fichiers de travail sont de simples fichiers texte. Ils ont l’avantage d’être aussi légers que possible, et robustes. Ils sont nettement mieux adaptés à ce qui s’appelle le suivi des versions (voir plus bas). Enfin, travailler avec de tels fichiers amène à utiliser des logiciels que l’on appelle des éditeurs de texte (et pas des traitements de texte comme Word). Utilisés par les informaticiens, ils peuvent être simples d’accès tout en permettant d’effectuer des opérations complexes sur le texte (comme du rechercher-remplacer avec des expressions régulières, plus puissantes que les fonctions équivalentes de Word) : tout est texte, donc il est facile de chercher des éléments de texte formaté, comme des mots en gras, les notes de bas de page, etc. Également, ils gèrent sans problème des fichiers lourds, tout en consommant peu de ressources matérielles (processeur, batterie, etc.).

En revanche Word est plus performant pour la correction automatique de l’orthographe et de la syntaxe, et plus intuitif pour le suivi des modifications en écriture collaborative. Cependant rien n’empêche de l’utiliser en combinaison avec un éditeur de texte, seulement pour ces fonctions où il est le plus efficace.

Comment réaliser les opérations habituelles en pratique

Bon, comment faire en pratique ? On présente ici comment écrire en RMarkdown, et produire des fichiers (PDF, Word ou HTML) avec RStudio, en pensant particulièrement à ceux qui ont l’habitude de Word + Zotero.

Bases de l’utilisation de RMarkdown avec RStudio

RMarkdown est une syntaxe, qui appartient à la famille des Markdown. La syntaxe de base, celle du Markdown original, a été conçue dans un double objectif : écrire des fichiers texte avec un formattage lisible, et qui soit facilement convertibles pour la publication web. Elle contient des éléments simples : des niveaux de titres, du gras et de l’italique, des liens hypertexte, des listes. Un ensemble de variantes de cette syntaxe ont été créées pour ajouter des fonctionnalités, tout en gardant le même esprit de lisibilité. Parmi elles, le Pandoc Markdown est très riche, et constitue la base de RMarkdown (Pandoc est un utilitaire qui convertit des fichiers textuels entre différents formats).

La production d’un texte mis en page requiert deux étapes : la saisie, et la mise en page (compilation). On peut utiliser deux logiciels différents pour ces deux opérations. Cependant on peut aussi, pour commencer, travailler uniquement avec RStudio, qui permet de faire les deux. On vous conseille donc d’en installer la dernière version. Le grand avantage de RStudio est que l’étape de compilation peut demander plusieurs logiciels, qu’il est un peu difficile d’installer et d’utiliser (Pandoc, LaTeX), mais RStudio s’occupe de tout cela et masque la complexité à l’utilisateur, qui n’a pas à s’en soucier.

Installer les logiciels

Avant de commencer, il faut installer les logiciels. Si vous voulez utiliser RStudio, il vous faut installer RStudio et R. Pour utiliser d’autres éditeurs (voir plus bas), il faut installer également Pandoc et LaTeX (pour produire des PDF). Cela n’a rien de très compliqué, les procédures sont classiques, il suffit de savoir où télécharger les fichiers d’installation.

Pour installer R, le plus simple est d’aller le télécharger là pour Mac (cliquer sur le premier lien des “Files”), ici pour Windows (cliquer sur le premier lien) et voir par là pour Linux (choisir votre distribution). Ensuite suivre les instructions.

Concernant RStudio, le télécharger en bas de cette page en choisissant votre système d’exploitation, et l’installation est classique.

Pour Pandoc, différents installeurs sont disponibles, et des instructions plus complètes également.

Enfin pour LaTeX, sous Windows le plus simple est d’installer MikTeX, et sous macOS, BasicTeX, la version basique de MacTeX est généralement suffisante, sinon MacTeX est lourd mais très complet. Pour Linux, TeX Live peut s’installer avec apt-get install texlive sous Debian ou Ubuntu.

Produire le document : appuyer sur un bouton dans RStudio

Pour maintenant donner une idée du processus d’écriture et de mise en page, commençons par un premier test, avec du texte sans formatage.

Dans RStudio, créez un nouveau fichier RMarkdown (à choisir dans le menu Fichier). Des éléments de démonstration sont présents. Dans les premières lignes, entre deux lignes de tirets, on trouve les métadonnées du document (titre, auteur, date) et des options de mise en page. Ces éléments seront automatiquement intégrés dans le document final. Pour ce billet, ces lignes sont :

---
title:  "RMarkdown : pour en finir avec Word"
author: "Florent Bédécarrats & Alexandre Hobeika"
date:   "25 février 2017"
output: html_document
---

Ensuite, vous pouvez écrire le texte que vous voulez, puis cliquez sur «Knit to PDF/Word/HTML» («tricoter» dans le format que vous voulez) et vous obtenez le résultat. En cas de problème à cette étape, n’hésitez pas à réinstaller la dernière version de RStudio.

Une syntaxe minimaliste

Pour produire un document plus riche, il faut indiquer là où vous voulez des titres et de la mise en forme du texte. La syntaxe de base du RMarkdown est celle de Markdown.

On écrit :

# Un titre de niveau 1
## Un titre de niveau 2
…
###### Un titre de niveau 6

Cela s’affichera comme des titres, et sera intégré comme tel dans la table des matières.

Pour le texte, un astérisque (*) encadre des caractères *en italique*, deux donnent des caractères **en gras**.

On peut également créer des listes, à un ou plusieurs niveaux, qui peuvent être numérotées ou non :

1. prune
2. poire
3. fruits rouges
    - fraise
    - cerise griotte
4. mirabelle

On peut enfin intégrer du texte cité, qui sera mis en page différemment du corps du texte, en le faisant commencer par un signe > :

> Lorsque, à seize ans, le jeune Karl Rossmann,
que ses pauvres parents envoyaient en exil

Des lignes consécutives sont considérées comme un même paragraphe. La séparation entre deux paragraphe est créée par une ligne vide. On peut également forcer un retour à la ligne en finissant une ligne par deux espaces (ou plus).

Voilà pour les bases. L’écriture scientifique requiert également des fonctions plus complexes : notes de bas de page, tableaux, figures, citations bibliographiques, références croisées… Il est bien sûr possible de les gérer en RMarkdown.

Des objets plus complexes : notes de bas de page, images, tableaux, encadrés

Il existe deux manières d’écrire une note de bas de page. La première est d’exprimer directement son contenu, entre crochets et avec un signe ^, comme ceci : [^Texte de la note.]. La seconde, plus adaptée pour les notes longues, définit un appel de notes avec [^…], et plus loin un paragraphe qui en spécifie le contenu avec le même crochet suivi de deux points, [^…]:, où ici doit être remplacé par un identifiant de votre choix. Par exemple, ces deux morceaux de code sont équivalents :

Du texte[^Contenu d'une note.].

Du texte[^n1].

[^n1]: Contenu d'une note.

On peut également insérer des images et des liens HTML :

Lien HTML: ["Texte du lien"](fichier.html)
Image: ![](image.jpg "Description de l'image")

Les tableaux seront produits par R, dans l’idéal, soit comme produits d’un calcul, soit comme résultats de l’importation en R d’un fichier de tableur (.xls ou .csv). Pour la mise en forme, en l’absence d’option spécifique, le résultat sera une sortie brute avec une police «informatique» (à largeur fixe). Pour obtenir des tableaux plus doux à l’œil, le plus simple est d’utiliser la fonction kable() du package knitr, par exemple :

knitr::kable( summary( cars ) )

Si on veut écrire des tableaux directement en RMarkdown, il existe la syntaxe suivante. Noter que la ligne entre les en-têtes et le contenu indique l’alignement dans la colonne.

| Auteur         | Package   | Année |
| :------------- | :-------: | ----: |
| Yixui Xie      | knitr     | 2012  |
| Hadley Wickham | ggplot2   | 2005  | 
Auteur Package Année
Yixui Xie knitr 2012
Hadley Wickham ggplot2 2005

On peut s’aider d’un utilitaire comme Tables Generator sur le web, TableFlip sous macOS, ou d’un plug-in pour éditeur de texte, comme TableEditor pour SublimeText.

Quant aux encadrés, ils peuvent être générés de plusieurs manières. La solution de facilité est d’utiliser le mode citation (lignes qui commencent par >) et de tracer des barres horizontales en haut et en bas de la zone d’encadré. Cette technique ne dessine pas de barres latérales, mais ça peut faire l’affaire. Une barre horizontale s’écrit avec trois tirets (ou plus) sur une ligne isolée :

> ---

> **Le statut des bouilleurs de cru**

> Distinct de la profession de distillateur, le statut de bouilleur de cru,
soit le droit de produire soi-même de l'eau-de-vie, est accordé
aux propriétaires récoltants, et de manière résiduelle aux bouilleurs
ambulants (porteurs d'un quota de droit à distiller, non-transmissible
depuis 1959).

> ---

Le statut des bouilleurs de cru

Distinct de la profession de distillateur, le statut de bouilleur de cru, soit le droit de produire soi-même de l’eau-de-vie, est accordé aux propriétaires récoltants, et de manière résiduelle aux bouilleurs ambulants (porteurs d’un quota de droit à distiller, non-transmissible depuis 1959).


Pour de véritables encadrés, en l’état actuel il est plus simple d’utiliser des fonctions spécifiques au format de sortie désiré. Pour des PDF, il est possible d’insérer du code LaTeX brut. Si on veut utiliser le package mdframed, appeler le package dans les en-êtes du fichier .Rmd en insérant les lignes suivantes (en respectant les espaces) :

header-includes:
   - \usepackage{mdframed}

puis commencer les encadrés par \begin{mdframed} et les terminer avec \end{mdframed} (au lieu des > ---).

Pour une sortie HTML, on peut insérer du HTML brut. Par exemple :

<p style="border:1px; border-style:solid; border-color:#000000; padding: 1em;">
Texte à encadrer.
</p>

Donne :

Texte à encadrer.

L’ensemble des fonctions disponibles sont résumées dans ce document, dont les versions plus complètes se trouvent aux liens suivants pour RMarkdown et pour le Pandoc Markdown, dont les fonctions sont utilisables en RMarkdown.

Feuilles de style

Pour configurer les options de mise en page (polices, marges, en-têtes, etc.), il suffit d’indiquer un fichier spécifiant ces options, ce qui s’appelle une feuille de style. Il faut la placer dans le même dossier que le fichier de travail, et préciser son nom dans les en-têtes du document.

Pour une sortie en format Word (.docx), la feuille de style est elle-même un fichier .docx, idéalement produit par RMarkdown, dans lequel on a édité les styles des titres de différents niveaux, les marges, etc. Pour indiquer son nom, on écrit dans les en-têtes :

---
output:
  word_document:
    reference_docx: messtyles.docx
---

Pour une sortie en format HTML on peut appeler un style pré-défini, ou bien indiquer un fichier CSS que vous aurez placé dans le même dossier que le fichier .Rmd, comme suit :

---                             ---
output:                         output:
  html_document:                  html_document:
    theme: unite                    css: mes_styles.css
    highlight: tang             ---
---                             

Pour une sortie en PDF, étant donné que la confection du document utilise LaTeX, on peut utiliser toutes les feuilles de style (ou plus précisément de classes de document) faites pour ce langage, qui possèdent l’extension .cls. En LaTeX, l’appel d’une feuille de style s’accompagne souvent d’options, par exemple pour le format du papier, le choix d’une sortie recto-verso ou non, etc. On peut y inclure la définition de macros, utilisables telles quelles en RMarkdown. On indique le fichier .cls et ses options dans les en-têtes du fichier .Rmd, par exemple de manière suivante :

---
output: pdf_document
documentclass: memoir
classoption: a4paper,12pt,final,twoside,openright
---

Voir la documentation pour plus d’options concernant les sorties Word, HTML et PDF.

La bibliographie : compatibilité avec Zotero (et autres gestionnaires)

Concernant la bibliographie, RMarkdown la génère automatiquement à partir d’un fichier contenant le détail des œuvres référencées, d’appels de références dans le document, et d’une feuille de style de bibliographie.

Pour le fichier des œuvres, un ensemble de formats sont acceptés, de BibTeX (.bib) à EndNote (.enl) en passant par JSON citeproc (.json). Il faut également placer ce fichier dans le même dossier que le fichier RMarkdown sur lequel on travaille, et le spécifier dans les en-têtes, par une ligne du type suivant, en indiquant le vrai nom du fichier (ici dans le cas d’un fichier .bib) :

bibliography: mon-fichier-biblio.bib

Pour la feuille de style bibliographique, RMarkdown utilise le format CSL (comme Zotero). Une liste de feuilles de style disponibles se trouve ici et aussi là. Celle produite par l’EHESS correspond à l’usage dans les sciences sociales françaises. Elle existe en deux versions, soit «Auteur-date», soit avec les références longues en note de bas de page. Pour l’indiquer c’est la même chose :

csl: ma-feuille-de-style-biblio.csl

En l’absence d’autres indications, la bibliographie est générée automatiquement en fin de document.

Il faut maintenant appeler les références. Dans le fichier bibliographique, à chaque œuvre est associé un identifiant de citation (citekey en anglais), que l’on insère dans le document lorsqu’on veut y faire référence. En RMarkdown cela se fait en écrivant [@citekey], et éventuellement d’autres précisions avec [@citekey, précisions].

Les citekeys elles-mêmes sont arbitraires, elles ne servent qu’à faire le lien entre les appels de références et le fichier des œuvres. Cependant, si vous demandez à votre logiciel de bibliographie de créer les citekeys sous la forme «AuteurDate», alors votre fichier RMarkdown ressemblera à : «Comme le décrit Hoggart [@Hoggart1970, 73] pour les années 1950-60…». C’est presque lisible tel quel, ce qui facilite les relectures et la communication avec les collègues.

Avec les logiciels dont les formats de fichier sont supportés par RMarkdown, il suffit en général de régler le format de création automatique des citekeys. Avec Zotero c’est légèrement plus compliqué. Une solution est d’installer l’extension «Zotero Better BibTeX», ce qui permet de générer des citekeys fixes dans Zotero et de les insérer par glisser-déposer des entrées dans le fichier RMarkdown. Pour cela : une fois l’extension installée, aller dans les préférences de Zotero. À l’onglet «Exportation», choisir le format de sortie par défaut comme «Better BibTeX QuickCopy» ; puis aller à l’onglet «Better BibTeX», à côté de «Citation key format» écrire «[auth][year]», et plus bas dans le menu à côté de «QuickCopy format» choisir «Pandoc». Enfin, sélectionner les références que vous voulez utiliser (ou toutes), faire un clic droit et demander «Generate BibTeX key». Vous verrez apparaître dans le champ «Extra» de chaque entrée un contenu du type «bibtex: Hoggart1970». Il est alors possible de glisser-déposer les références directement dans le texte que vous écrivez. Ne pas oublier d’exporter votre bibliographie au format .bib avant la compilation (confection) du document. Voir la documentation de cette extension pour en savoir plus, notamment si vous préférez un autre format de citekey.

Voilà pour les éléments de texte. Mais l’intérêt de RMarkdown, en particulier par rapport aux autres variantes de Markdown, est de pouvoir aussi prendre en charge des calculs ou des visualisations réalisées avec R.

Intégrer directement les traitements en R : renforcer la reproductibilité analytique

Une des grandes forces du format RMarkdown est sa capacité d’intégrer directement du code R. Les calculs sont effectués au moment de la production du document final. Ainsi on évite d’effectuer des manœuvres hasardeuses avec les données, comme des copier-coller, sources potentielles d’erreurs et de non-reproductibilité éditoriale.

Les balises pour indiquer le code à exécuter

Le code se signale par les signes ```{r} pour commencer, et ``` pour finir :

```{r}
print( "Hello world!" )
```

On peut aussi intégrer du code dans des phrases, en l’entourant par `r et `, par exemple `r 2+2` se transformera en 4.

Le programme qui se charge d’effectuer les calculs s’appelle knitr. C’est un package R. RStudio l’appelle automatiquement quand on demande de fabriquer le document final («Knit to PDF» ou autres). Il possède des options, en particulier celle de faire apparaître ou non les instructions des calculs dans le document. Par défaut elles sont affichées, pour que ce ne soit pas le cas il existe l’option echo = FALSE. L’exemple qui est donné quand vous créez un nouveau document RMarkdown sous RStudio montre comment structurer son document : un premier bloc contient les options générales de knitr pour ce fichier, auquel on peut ajouter le chargement des packages que l’on utilise par la suite ; ensuite on écrit des blocs avec des options spécifiques à chaque bloc. Par exemple, au début du fichier :

```{r setup, include = FALSE }
knitr::opts_chunk$set( echo = TRUE )
library( ggplot2 )
```

Et ensuite, quand on veut intégrer des traitements R :

```{r plot_pressure, echo = FALSE }
plot( pressure )
```

À noter que dans ces deux exemples, le mot de la première ligne qui suit immédiatement ```{r et précède la première virgule (ici setup et plot_pressure), est simplement le nom, optionnel et arbitraire, que vous donnez à ce bloc d’instructions.

Pour en savoir plus sur knitr, on vous renvoie à son manuel d’utilisation. S’y repérer demande de connaître son vocabulaire : les morceaux de code sont appelés des «chunks» (morceaux), tandis que les options associées sont des «hooks» (des «aiguilles à tricoter»). Les exemples sont parfois écrits sous une forme qui commence par << …… >>= et finit avec @, mais pour les options c’est la même chose.

Les visualisations, leurs légendes et références

Pour produire des graphes, cartes, ou autres visualisations, il suffit d’écrire le morceau de code correspondant.

Le graphique se voit attribuer une numérotation automatiquement, dès lors qu’il possède une légende (caption), ce qui est souvent indispensable. Si vous voulez y faire référence par la suite, il faut y ajouter un identifiant. Cela peut se faire de la manière suivante :

```{r, fig.cap="Légende.\\label{fig:identifiant}" ) }
plot(…)
```

Légende est le texte qui sera affiché sous le graphique. L’identifiant, qu’on a noté ici fig:identifiant et que vous pouvez modifier comme vous le souhaitez, est le petit nom que vous invoquerez pour y faire référence. Par exemple, pour obtenir quelque chose comme «voir figure 2.1», on écrit dans le fichier Rmd :

voir figure \ref{fig:identifiant}

Cette syntaxe est certes un peu lourde et ne marche que pour produire des PDF. Il existe une meilleure solution, qui marche pour PDF et HTML : appelée Bookdown, elle utilise la syntaxe RMarkdown, et y ajoute quelques fonctionnalités utiles pour la publication. Elle est déjà utilisable avec RStudio mais de façon encore un peu compliquée, mais devrait se simplifier rapidement.

Écrire en pensant la reproductibilité

Enfin, la reproductibilité analytique n’est pas garantie par l’outil RMarkdown seul, mais par la combinaison du fichier .Rmd et des données qui y sont imbriquées. Dans le cas de calculs complexes, on peut vouloir éviter d’effectuer des traitements longs et lourds à chaque fois qu’on modifie le texte, et privilégier la compilation du document final à partir de résultats intermédiaires de calcul.

Or, comme l’en avertit Andrew Gelman, «ce n’est pas reproductible si ça ne marche que sur votre ordinateur». Si on veut optimiser la reproductibilité analytique, il convient donc de la penser au cours de l’élaboration du document, en travaillant ses fichiers d’analyses statistiques jusqu’à ce qu’ils soient lisibles et convocables sur demande, bref en maintenant les liens entre les différents fichiers de travail.

Dissocier les logiciels selon leurs points forts

On a parlé de syntaxe, mais avec quels outils travailler ? Il est possible d’utiliser uniquement RStudio. Cependant, s’il est efficace pour effectuer les calculs R et transformer le fichier vers les formats de sortie, il n’est pas très confortable pour écrire. En pratique, on peut combiner plusieurs logiciels et tirer parti de leurs avantages respectifs. Le grand intérêt des fichiers texte est leur ubiquité : ils sont gérés par tous les logiciels, aussi bien les traitements de texte que les éditeurs de texte. On peut donc passer de l’un à l’autre insensiblement. On propose ici un exemple d’usage réel : une écriture avec un éditeur de texte, une correction orthographique avec Word, et la création du rendu avec RStudio.

Les éditeurs de texte et le (R)Markdown

Tous les éditeurs de texte modernes offrent des outils d’aide à l’écriture en Markdown et en RMarkdown. Les plus simples sont l’insertion de balises de mots en gras ou en italique grâce aux combinaisons de touches (par exemple commande-B et commande-I respectivement). Ils peuvent s’accompagner de coloration de la syntaxe, facilitant la lecture (cf. exemple ci-contre). Ils détectent le contexte, et insèrent les symboles adéquats (parenthèses fermantes, chevrons dans un contexte de citation, etc.), ce qui facilite l’écriture.

scrshot-rmd

Une capture d’écran de ce fichier sous TextMate, avec le thème MultiMarkdown (les couleurs sont facilement modifiables).

TextMate sous macOS est remarquable, et utilisable gratuitement. Simple d’utilisation au premier abord, il est en même temps très puissant, sa complexité se découvrant peu à peu. À la création d’un fichier, sélectionner le langage, ici Pandoc, après avoir installé le module associé : le télécharger là en cliquant sur «Clone or download» et «Download ZIP», puis extraire le .zip en double-cliquant dessus, le renommer en faisant de sorte que son nom se termine par «.tmbundle», et le glisser-déposer sur l’icône de TextMate pour l’installer. Il est possible de naviguer dans le plan avec commande-maj-T.

Disponible pour tous les systèmes d’exploitation, Sublime Text est aussi excellent et utilisable gratuitement, quoique légèrement plus complexe d’utilisation. BBEdit et sa version plus simple et gratuite TextWrangler sont aussi recommandés. Pour vous faire la main, quantité de logiciels plus modestes mais tout à fait utilisables existent.

Si on vient de Word ou LibreOffice et qu’on n’a pas besoin d’intégrer de traitements en R, on peut être plus à l’aise avec des éditeurs spécialisés dans l’écriture en Markdown. Typora ou Texts sont multi-plateformes, et parmi les meilleurs actuellement pour le Pandoc Markdown. Ils disposent d’une interface graphique (à menus déroulants) familière, et à partir de laquelle on peut générer des .docx, PDF, etc.

Sur mobile, de très bons logiciels d’écriture Markdown existent, avec des fonctions plus ou moins riches, dont Ulysses, Editorial, Bear, Byword, iA Writer, JotterPad, etc. Ils utilisent le Markdown simple le plus souvent, parfois le MultiMarkdown, mais cela ne pose pas de problème d’y écrire du RMarkdown, qui en est très proche.

Exporter en Word pour les corrections et l’écriture collaborative…

Pour utiliser le correcteur de Word ou Antidote, ou bien travailler collaborativement avec des utilisateurs de Word, on peut convertir le .Rmd en format Word .docx.

La difficulté se situe au niveau de la validation des commentaires et de leur réintégration en RMarkdown. Le plus simple actuellement est de les intégrer «à la main» dans le fichier .Rmd, c’est un des inconvénients de ce système et la limite de la collaboration avec Word.

Le plus simple est donc de se faire relire directement en .Rmd, ce qui permet d’utiliser le mode révision de Word. Le plus difficile est probablement de trouver un relecteur qui ne soit pas indisposé par le RMarkdown.

… ou utiliser les outils des informaticiens avec RStudio

Si vous trouvez des collaborateurs volontaires, il existe aussi d’autres méthodes permettant l’écriture collaborative directement en RMarkdown. Les informaticiens écrivent à plusieurs des programmes depuis plus d’un demi-siècle, sur des fichiers texte comme le .Rmd, et ont développé des outils pour cela : la comparaison des différences et le suivi des versions. RStudio fait là aussi un travail remarquable pour simplifier et rendre assez indolore leur usage, et donner une ergonomie de suivi des modifications qui s’approche de celui de Word.

suivi-modifs-git

Un exemple de suivi des modifications (de l’écriture de ce fichier) avec RStudio. Ici, une comparaison de deux fichiers. En vert les ajouts, et s’il y avait des lignes supprimées elles seraient colorées en rouge. Deux boutons à droite permettent d’«accepter» ou «rejeter» les modifications. On peut en parallèle éditer le même fichier dans une autre fenêtre.

Entrer dans le détail de leur utilisation dépasse l’objet de cette présentation, et fera l’objet d’un prochain billet, mais si vous en voulez un aperçu vous pouvez essayer l’éditeur de texte en ligne Draft.

Compiler le document final avec RStudio

Enfin, on peut n’utiliser RStudio que pour la compilation des documents, que ce soit en Word pour les corrections, ou bien en PDF ou HTML pour la publication. Cela demande un simple clic, comme mentionné précédemment.

Conclusion

On a présenté ici de façon détaillée l’ensemble des opérations d’écriture en RMarkdown, pour que vous puissiez évaluer honnêtement les avantages mais aussi les coûts de transition par rapport à Word ou LaTeX. On n’est pas encore arrivé au point où on pourra se dispenser complètement de Word, mais on s’en approche rapidement.

Pour des versions plus résumées de cette présentation, n’hésitez pas à consulter cette référence de la syntaxe RMarkdown, Une présentation synthétique de Julien Barnier, et quelques explications pour clarifier ce que sont RMarkdown, knitr, Bookdown, etc..

Beaucoup d’autres options, qu’il est impossible de présenter ici, sont disponibles avec RMarkdown (et le Pandoc Markdown, dont il est dérivé). Pour les explorer, voir la documentation de Pandoc, ainsi que celle de RMarkdown pour la production de fichiers PDF, HTML ou Word, et plus simplement Google et StackOverflow. Il est également possible de faire sans RStudio, en cas de besoin. RStudio fait fonctionner ensemble plusieurs programmes «comme si de rien n’était», en masquant le processus. Pour qui voudrait s’en passer, par nécessité, goût ou volonté de customisation, il suffit d’installer et d’utiliser knitr, puis Pandoc, et LaTeX/BibLaTeX.

En tout cas vous êtes maintenant armés pour une utilisation généraliste de RMarkdown. N’hésitez pas à le tester, le Markdown et ses dérivés sont des formats qui se sont largement diffusés pour l’écriture sur le web, et commencent à s’imposer comme un des standards de l’écriture scientifique.

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website

Exploiter les donnée d’enquêtes ménages pour la recherche ou la décision publique : un guide et trois billets

Faisant écho au Prix Nobel d’économie attribué à Angus Deaton, en reconnaissance notamment de ses travaux sur les enquêtes de conditions de vie des ménages, nous mettons aujourd’hui en ligne un document de travail sur ce sujet, qui sera l’occasion de trois billets sur notre blog. Cet article explique en quoi les données d’enquêtes ménages menées régulièrement dans (presque) tous les pays du monde  constituent une mine d’informations précieuses pour la recherche et la prise de décision publique, mais que celle-ci reste dramatiquement sous-utilisée. L’article propose un guide détaillée qui explique où trouver ces données, comment se les procurer et comment les analyser. Elaboré initialement comme l’annexe statistique d’un article récemment publié dans le Journal of Hydrology, il prend comme exemple didactique les multiples enquêtes qui renseignent sur l’accès à l’eau potable dans la mégalopole de Kinshasa en République Démocratique du Congo.

Voici l’article en question :

Et à venir dans les prochaines semaines, trois billets par Florent Bédécarrats, l’un des auteurs de cet article :

  • Le Mardown : un format pour de publications scientifiques qui favorise la réfutabilité et reproductibilité des résultats, mais aussi la diffusion des méthodes (co-écrit avec Alexandre Hobeika)
  • Pourquoi s’intéresser aux données d’enquêtes ménages et où les trouver ?
  • Survey : un package R qui facilite l’analyse de données issues d’enquêtes complexes

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website

Au secours, ma regex ne marche pas !

Les expressions régulières sont des outils très puissants et commodes pour manipuler du texte, mais il faut bien reconnaître qu’on peut parfois se noyer dans leur syntaxe ésotérique. Heureusement il existe des petits logiciels, gratuits pour la plupart, qui permettent de visualiser la correspondance entre les chaînes de caractères (i.e. le texte) qu’on veut analyser et l’expression régulière qu’on y applique.

Leur principe est simple: on indique le texte-cible, la regex, ainsi que la syntaxe qu’on utilise, puis le logiciel colore les éléments du texte qui correspondent aux éléments repérés dans la regex par des parenthèses (pour rappel, les parenthèses servent à désigner des morceaux du texte qu’on veut garder en mémoire pour réutiliser après). On en présente quelques-uns, pour plusieurs plate-formes, afin de montrer l’étendue des fonctionnalités disponibles. L’offre est fournie et en renouvellement assez rapide, donc on ne peut être exhaustif.

Pour cette présentation, on reprend les chaînes de caractères utilisées dans ce billet précédent.

Sur le web

Les applications web sont accessibles de tout ordinateur, à condition bien sûr d’avoir un accès internet. Il en existe un très grand nombre, probablement des projets d’étudiants en informatique. On en présente deux, qui sortent du lot par leurs fonctionnalités et leur design.

Regex101 est de notre point de vue le meilleur. Il permet de travailler avec la syntaxe PCRE, utilise des couleurs lisibles, et offre même une analyse détaillée des morceaux de la regex ainsi qu’une référence de la syntaxe. L’interface peut apparaître un peu lourde au premier abord, mais on s’y fait vite.

regex101

Le principe est d’écrire sa regex dans le champ “regular expression”, les chaînes de caractères que l’on veut tester dans “test string”. Il faut également s’assurer de deux réglages: premièrement qu’on travaille bien avec la syntaxe PCRE (cliquer dans la colonne de gauche), et que les lignes seront analysées comme des chaînes de caractères indépendantes (écrire un “g” à la suite de la regex). On obtient alors, dans la colonne de droite, tout d’abord l’explication des motifs composant la regex, puis ce qui est trouvé comme correspondant aux parenthèses dans la regex et mis en mémoire. En utilisant des patterns plus complexes, les couleurs sont différentes pour les parenthèses distinctes. Il est alors facile de repérer les éventuelles erreurs dans l’écriture de l’expression régulière.

On peut aussi tester le remplacement avec Regex101, en cliquant sur le “+” en bas de l’écran, près de “Substitution” (cf. image ci-dessus). Un champ s’ouvre, on peut y écrire ce par quoi on voudra remplacer la chaîne de caractères correspondant à la regex (comme, en R, dans gsub(pattern, remplacement, vecteur)). Le résultat apparaît dans le champ en-dessous.

En complément, Debuggex offre une fonctionnalité originale, celle de représenter la regex par un diagramme qui en sépare les morceaux. On peut ainsi mieux comprendre ce qui se passe, et repérer les fautes de frappe ou de composition. Il s’agit d’une représentation graphique de ce que Regex101 affiche, sous forme de texte, dans son cadre “Explanation” en haut à droite.

Pour l’utiliser, il faut utiliser les réglages suivants. Tout d’abord sélectionner l’option “Flags: m”, qui permet d’analyser toutes les lignes du texte (et pas seulement la première). Concernant le choix de la syntaxe, il faudrait choisir “PCRE”, mais au moment de l’écriture de ce billet cette option comporte un bug au niveau de la coloration des résultats ; le mieux est d’opter pour la syntaxe de regex “Javascript”, qui est proche, et pour laquelle Debuggex n’a pas ce bug (!). Ensuite, on peut écrire sa regex et les chaînes de caractères qu’on veut analyser, et les résultats sont la coloration des chaînes de caractères qui correspondent à la regex et aux parenthèses, ainsi que la représentation graphique de la regex (cf. capture d’écran).

debuggex

On peut cependant avoir besoin de tester ses regex dans le train, la jungle ou tout autre endroit sans connexion. Pour couvrir ces cas, des logiciels existent.

Sur ordinateur

Il y a d’abord les nombreux petits logiciels gratuits et efficaces pour tester ses regex. Sous Mac OS, Reginald est un bon choix, gratuit et récent. Il utilise la syntaxe ICU, proche de PCRE, et avec laquelle fonctionne le package stringi en R. Sous Windows, les choix équivalents de petits utilitaires ne manquent pas.

Pour des besoins plus poussés, la référence est RegexBuddy, disponible sous Windows, ou en utilisant un émulateur comme Wine sous Mac OS et très probablement Linux. Il est payant et a un look vintage, mais il est diaboliquement riche (peut-être même trop pour une utilisation en sciences sociales). On peut l’utiliser comme les précédents, et il fonctionne parfaitement pour tester les recherches et le remplacement, et ce avec une très grande variété de choix de syntaxe. Mais en plus de cela il propose des fonctions d’explication d’une regex, de debugging, ou encore de création d’une regex pas à pas, et beaucoup d’autres choses. Il est trop foisonnant pour qu’on en détaille le fonctionnement ici, mais l’interface est plus intuitive qu’elle n’en a l’air au premier abord (les onglets “Test” et “Highlight”, ainsi que “Create”, suffisent pour reproduire les fonctions proposées par les autres logiciels présentés ici). Au passage, on peut signaler, du même éditeur, RegexMagic qui permet également de créer des regex, mais avec une approche différente. On ne l’a pas testé, mais il semble adapté pour l’écriture de regex complexes.

Voilà, avec ça normalement vous êtes armés !

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website

Les expressions régulières : le super rechercher-remplacer

Les expressions régulières sont un outil extrêmement utile pour réaliser des opérations complexes de recherche-remplacer sur des grandes quantités de texte, qui nous semble d’intérêt général pour tous les chercheurs en sciences sociales. On en présente ici le principe, la syntaxe et comment les utiliser concrètement.

Un outil indispensable pour les travailleurs du texte

Nous passons notre temps, en sciences sociales, à manipuler des données textuelles : réponses ouvertes à un questionnaire, noms de personnes, lieux, caractéristiques sociales, mais aussi articles de presse, correspondances, transcriptions d’entretiens, jusqu’aux textes scientifiques que nous produisons. Or, pour traiter de telles données avec un ordinateur, il est fréquent de devoir effectuer des transformations systématiques, à des fins qui vont d’un nettoyage avant importation pour une analyse statistique, jusqu’à une conformation à des normes typographiques avant publication.

Pourquoi programmer pour écrire ?

Parmi les outils que nous utilisons couramment, certains permettent d’effectuer de telles modifications, en particulier R et OpenOffice/LibreOffice ou Word. Chacun a déjà utilisé les fonctions de recherche et de “rechercher-remplacer” de Word ou équivalent. On présente ici une généralisation de ces fonctions qui permet d’automatiser rapidement presque toutes les opérations textuelles imaginables. Pour les utiliser, il suffit d’un langage de programmation (par exemple R, Python, etc.) ou d’un bon éditeur de texte. Parmi les logiciels de traitement de texte, LibreOffice et OpenOffice permettent de faire la même chose ; c’est le cas aussi de Word (mais avec une syntaxe assez différente, qu’on n’évoquera pas ici).

Nous avons donc sous la main des logiciels dotés de fonctions à même de nous épargner des heures de travail fastidieux, mais bien souvent nous ne savons pas les utiliser, ou nous ne savons même pas qu’elles existent.

Le sujet peut paraître compliqué au premier abord, et si vous regardez rapidement la suite de ce billet, vous risquez de ne voir que des signes cabalistiques rebutants. Pas d’inquiétude toutefois : les expressions régulières ne sont pas faites pour être lues, mais pour être faciles à écrire.

Ce billet propose une introduction à ce sujet, afin de montrer la logique de cet outil, à la fois très simple et puissant. Car le plus important n’est pas de connaitre les expressions régulières, mais d’en comprendre le principe et savoir ce qu’il est possible de faire avec. Après quoi, il existe de nombreuses aides que même les chercheurs expérimentés consultent souvent.

Le principe : faire repérer des formes textuelles à l’ordinateur

Supposons que, pour les individus d’une population dont on veut faire une prosopographie, on ait saisi une liste de dates et lieux de naissance dans un fichier texte (ou un vecteur de type character sous R) – ici des membres des Francs Tireurs et partisans (FTP) :

né le 3 juillet 1897, à Rennes (35)
né le 13 mai 1893, à Le Chambon-Feugerolles (42)
née en 1895, à Tauriac (47)
né le 2 octobre 1896, à Louey (65)
née le 1er janvier 1908, à Końskowola -- Pologne (99)
…

Comment transformer cette série de lignes de texte, dont la structure est toujours la même, en une autre série de lignes de texte, chacune comportant uniquement l’année de naissance ? Si on sait réaliser cette opération, alors on pourra faire de même pour le département et les autres données qui nous intéressent, et transformer ce texte en base de données prête pour l’analyse. Concentrons-nous donc sur l’année.

À conceptualiser, l’opération est très simple. Il suffit, dans chaque ligne, de rechercher l’année, de la mémoriser, puis de remplacer le contenu de la ligne par elle. Comment repérer l’année ? À l’œil nu, rien de plus facile : c’est le nombre composé de quatre chiffres. On pourrait aussi remarquer qu’elle ici est le deuxième nombre de chaque ligne, ou encore le premier nombre qui soit suivi immédiatement d’une virgule, etc. Toutes ces désignations de formes textuelles sont ce qu’on appelle des motifs (patterns, en anglais).

Si on se décide pour cette première caractérisation de l’année, la procédure qu’on souhaitera effectuer pourra alors s’écrire, en langage humain :

Dans chaque ligne,
  Remplace: l'ensemble de la ligne
  Par: le premier nombre à quatre chiffres trouvé

Le travail est donc très simple à penser. Mais s’il doit être répété sur un grand nombre de lignes, c’est fastidieux. Certains vont donc employer un esclave doctorant, mais un programme informatique de quelques lignes le fait aussi bien. Et le travail de programmation qui peut paraître compliqué au premier abord est en réalité très simple à écrire, au point que c’est une solution plus rapide (et même plus sûre) que de recopier manuellement les informations qui vous intéressent, et ce dès que vous avez plus que quelques lignes[1].

En effet, la moitié du travail, à savoir l’écriture de la procédure “comme si on faisait à la main” est déjà réalisée. Il ne reste plus qu’à savoir comment la faire comprendre à l’ordinateur, et comment la lui faire exécuter.

La syntaxe qui permet de traduire les instructions précédentes pour l’ordinateur, d’indiquer les motifs qu’on désire repérer, est appelée expressions régulières, en anglais regular expressions, souvent abbrevié en regex[2]. Il en existe plusieurs variantes. R utilise une syntaxe très puissante et très répandue, appelée PCRE ou parfois “de type perl”[3], comme à peu près tous les langages de programmation généralistes.

Bases de la syntaxe

Les expressions régulières sont donc une syntaxe pour décrire de manière assez naturelle des formes textuelles à un ordinateur. Cela n’a rien d’évident a priori, mais on va voir comment désigner des fragments de formes comme “n’importe quoi”, “quatre chiffres exactement”, “au moins une majuscule”, etc. La syntaxe comportera, inévitablement, des symboles un peu cabalistiques, mais il ceux-ci ne sont pas nombreux, et l’important est qu’ils se combinent comme du Lego.

Classes de caractères et quantificateurs

La syntaxe des expressions régulières se compose de deux types d’éléments : des groupes de caractères (par exemple : les chiffres, les lettres, les espaces, mais aussi des groupes que l’on peut définir soi-même, comme les lettres a et c, les chiffres de 0 à 7…)[4], et des quantificateurs (par exemple : un, deux, zéro ou un, un ou plus, entre 4 et 7, un nombre quelconque, etc.). On utilise ici cette convention graphique : gras pour les groupes de caractères, italique pour les quantificateurs.

Une expression régulière est ainsi une suite de groupe de caractères, chacun accompagné d’un quantificateur. Par exemple : un certain nombre de lettres, au moins un espace, exactement quatre chiffres.

Les groupes de caractères les plus courants sont les suivants (en PCRE) :

  • \w : les lettres (w pour word)
  • \d : les chiffres (d pour digit)
  • \s : les espaces (s pour spaces)
  • [A-Z] : les majuscules
  • [abd;_] : les lettres a, b, et d, le point-virgule (;), et l’underscore (_)
  • . : n’importe quel caractère (excepté le saut de ligne)
  • k : la lettre k
  • (k|\d{2}) : la lettre k, ou bien deux chiffres

Il existe également leur négation :

  • \W : tout sauf les lettres
  • \D : tout sauf les chiffres
  • \S : tout sauf les espace
  • [^A-Z] : tout sauf les majuscules
  • [^abd;_] : tout sauf a, b, d, le point-virgule (;) ou l’underscore (_)

Maintenant les quantificateurs :

  • * : zéro ou plus
  • + : un ou plus
  • ? : zéro ou un
  • {2} : deux exactement
  • {2,5} : entre 2 et 5 inclus
  • {,6} : entre 0 et 6 inclus
  • {6,} : six ou plus
  • {2;5} : exactement deux ou cinq
  • (pas de quantificateur) : un exactement

Une absence de quantificateur désigne une et une seule occurrence. Ainsi, le motif abc correspond à un a, puis un b, puis un c, soit exactement le texte abc, comme d’habitude.

Avec ces bases, on peut déjà aller très loin. Revenons à l’exemple des FTP : on peut maintenant écrire le motif correspondant à quatre chiffres : \d{4} (ou \d\d\d\d, c’est la même chose).

Donc, si on veut extraire les années de l’exemple donné précedemment, on va chercher à écrire : “Dans chaque ligne, cherche un fragment de la forme \d{4}, et garde-le en mémoire”.

Mémoriser des fragments du texte analysé

Les expressions régulières servent à repérer des morceaux de texte correspondant à un motif que l’on écrit de façon formelle. Mais si on veut réutiliser ces morceaux de texte, il faut pouvoir les mettre en mémoire, et ensuite accéder au contenu de cette mémoire.

Pour cela, la syntaxe consiste à entourer ce qu’on veut mettre en mémoire de parenthèses. Ainsi, pour chercher et mettre en mémoire quatre chiffres, on écrira l’expression régulière (\d{4}).

Une fois appliqué cette expression régulière à une chaîne de caractères, le premier élément correspondant (ici le premier nombre à quatre chiffres trouvé) est stocké dans la variable \1 (ou parfois $1).

Ainsi, pour extraire l’année de né le 3 juillet 1897, à Rennes (35), on écrira : si tu trouves le motif (\d{4}) dans cette chaîne de caractères, renvoie-moi \1.

Caractères spéciaux

Vous aurez remarqué qu’on utilise certains caractères pour écrire les expressions régulières : \ { } ( ) [ ] . + ? - *, etc. Comment écrire pour dire qu’on veut identifier de tels caractères dans un texte, qui pourrait en contenir ?

Pour cela, on les fait simplement précéder de \, pour signaler qu’il ne faut pas les considérer comme caractères spéciaux, mais comme caractères réels. Ainsi, pour trouver un + dans un texte, on écrira dans l’expression régulière \+.

Il existe également d’autres caractères spéciaux, qu’on ne peut pas écrire normalement avec les touches du clavier. Il s’agit des espaces comme les sauts de ligne, de page, les tabulations ; ils s’écrivent comme suit, respectivement : \n, \f, \t.

Enfin, deux caractères spéciaux très commodes indique le début et la fin de la ligne : ^ et $, quand ils sont placés au début et à la fin de la regex. Ils s’écrivent aussi, respectivement, \A et \Z.

Ainsi, une ligne complète, contenant un nombre à quatre chiffres avec potentiellement des choses avant, et potentiellement des choses après, peut s’écrire ainsi :

^.*(\d{4}).*$

Pour la lire il faut détailler sa composition :

  • ^ : début du fragment de texte,
  • .* : n’importe quelle chaine de texte (peut contenir 0 caractère),
  • (\d{4}) : quatre chiffres, à garder en mémoire,
  • .* : n’importe quelle chaine de texte (peut contenir 0 caractère),
  • $ : fin du fragment de texte.

Il ne reste plus qu’à insérer ce motif dans un exemple d’utilisation concrète.

Utilisation concrète

Quels logiciels utiliser, pour faire des recherches ou du rechercher-remplacer ? On présente ici deux solutions possibles : R et LibreOffice. Chacune utilise une variante de la syntaxe présentée ici, mais les différences ne commencent à être visibles que dans les cas compliqués, donc on peut les négliger.

On va effectuer maintenant la même opération avec ces deux outils, sur l’exemple du début : sélectionner l’année dans une série de lignes de renseignements d’état-civil.

Les expressions régulières en R

La première chose à savoir, pour écrire des expressions régulières en R, est qu’il faut doubler tous les backslashes[5] : on n’écrit pas \d mais \\d.

Ensuite, admettons que nos lignes de texte soient représentées par un vecteur de type character. Il est alors facile d’effectuer pour l’ensemble des éléments de ce vecteur une opération de recherche des éléments qui correspondent à une regex, ou de recherche et remplacement sur ces éléments.

Fonctions de base de R : grep() et gsub()

La recherche utilise la fonction grep(regex, vecteur) – dont le nom signifie Globally search a Regular Expression and Print. Plus précisément, pour s’assurer qu’elle emploie la syntaxe qu’on a évoquée ici, il convient d’ajouter l’option perl = TRUE. Cela permet d’indiquer qu’on utilise la syntaxe PCRE. Cette fonction renvoie les numéros de position dans le vecteur recherché des éléments qui correspondent à la regex, ce qui est particulièrement utile pour sélectionner des lignes d’un dataframe (par exemple, df[grep(regex, df$var), ]). Elle peut aussi renvoyer les éléments eux-mêmes, avec l’option value = TRUE. Enfin la fonction grepl(regex, vecteur) – ne me demandez pas ce que signifie le l – renvoie TRUE ou FALSE pour chaque élément du vecteur, selon qu’il corresponde à la regex.

Les commandes suivantes les montrent en action :

> naiss <- c("né le 3 juillet 1897, à Rennes (35)",
             "né le 13 mai 1893, à Le Chambon-Feugerolles (42)",
             "née en 1895, à Tauriac (47)",
             "né le 2 octobre 1896, à Louey (65)",
             "née le 1er janvier 1908, à Końskowola -- Pologne (99)")
> grep("\\d{4}", naiss, perl = TRUE)
[1] 1 2 3 4 5
> grep("\\d{4}", naiss, perl = TRUE, value = TRUE)
[1] "né le 3 juillet 1897, à Rennes (35)"
[2] "né le 13 mai 1893, à Le Chambon-Feugerolles (42)"
[3] "née en 1895, à Tauriac (47)"
[4] "né le 2 octobre 1896, à Louey (65)"
[5] "née le 1er janvier 1908, à Końskowola - Pologne (99)"
> grep("\\d{6}", naiss, perl = TRUE)
integer(0)
> grepl("^née", naiss, perl = TRUE)
[1] FALSE FALSE  TRUE FALSE  TRUE

La première ligne crée un vecteur avec cinq arguments. La deuxième nous indique que la chaine de caractère demandée (4 chiffres à la suite) est présente dans les lignes 1, 2, 3, 4 et 5; et la troisième nous retourne les chaines en question grâce à l’option value = TRUE. La quatrième montre que la chaine de caractère 6 chiffres d’affilée n’est présente nulle part (integer(0)). Enfin, la dernière teste si elle commence ("^) par née et donc si la personne est une femme.

Le rechercher-remplacer s’effectue avec la fonction gsub(regex, remplacement, vecteur) – abréviation de Global SUBstitution. De la même manière, on conseille d’utiliser l’option perl = TRUE. Ainsi :

> gsub("^.*(\\d{4}).*$", "\\1", naiss, perl = TRUE)
[1] "1897" "1893" "1895" "1896" "1908"

Attention, la fonction gsub() laisse inchangées les chaînes de caractères qui ne correspondent pas à la regex :

> gsub("^né .*(\\d{4}).*$", "\\1", naiss, perl = TRUE)
[1] "1897"
[2] "1893"
[3] "née en 1895, à Tauriac (47)"
[4] "1896"
[5] "née le 1er janvier 1908, à Końskowola - Pologne (99)"

À noter que dans ces deux fonctions on peut utiliser l’option ignore.case = TRUE, qui permet de ne pas tenir compte de la casse des lettres et traîter de manière équivalente majuscules et minuscules, ce qui peut être utile.

Ces fonctions font partie des outils de base en R. Il en existe d’autres, qui peuvent être plus pratiques, dans des modules dédiés à la manipulation de texte.

Modules utiles pour traiter du texte

stringr

Le module stringr dispose, pour les mêmes usages, de str_detect(vecteur, regex) (attention à l’inversion !), et de str_replace_all(vecteur, regex, remplacement). Plus précisément, str_detect() fait le même travail que grepl(). Il existe aussi str_extract(vecteur, regex), qui peut être très pratique, et correspond exactement à ce qu’on veut ici. On les invoque, ainsi que la syntaxe perl, de la manière suivante :

> str_detect(naiss, perl("\\d{4}"))
[1] TRUE TRUE TRUE TRUE TRUE
> str_replace_all(naiss, perl("^.*(\\d{4}).*$"), "\\1")
[1] "1897" "1893" "1895" "1896" "1908"
> str_extract(naiss, perl("\\d{4}"))
[1] "1897" "1893" "1895" "1896" "1908"

stringi

Très complet pour travailler avec des caractères exotiques et de manière générale un excellent outil pour traiter du texte en R, le module stringi comprend les fonctions stri_detect_regex(vecteur, regex) et stri_replace_all_regex(vecteur, regex, remplacement), ainsi que stri_extract_first_regex(vecteur, pattern) (et d’autres du même type, comme stri_extract_all_regex(vecteur, pattern)). Il n’est pas nécessaire d’indiquer que l’on utilise des regex de type perl, car c’est la syntaxe qu’il utilise par défaut[6]. Attention, ici les éléments mis en mémoire se rappellent avec $1, $2 etc., plutôt que \\1, \\2, etc., cf. deuxième des lignes suivantes :

> stri_detect_regex(naiss, "\\d{4}")
[1] TRUE TRUE TRUE TRUE
> stri_replace_all_regex(naiss, "^.*(\\d{4}).*$", "$1")
[1] "1897" "1893" "1895" "1896" "1908"
> stri_extract_first_regex(naiss, "\\d{4}")
[1] "1897" "1893" "1895" "1896" "1908"

Avec LibreOffice/OpenOffice

Nul besoin de passer par un logiciel de statistiques pour utiliser des expressions régulières. LibreOffice et OpenOffice peuvent également effectuer des recherches et des remplacement de cette manière. La syntaxe qu’ils utilisent est documentée en détail ici pour LibreOffice, là pour OpenOffice, mais dans les deux cas les bases sont les mêmes que ce qu’on a présenté ici.

Pour les utiliser, il faut aller dans le menu “Édition” et y choisir “Rechercher & Remplacer”; puis, dans la fenêtre qui s’ouvre alors, cocher la case “Expressions régulières”. Les valeurs mises en mémoire se retrouvent avec $1, $2, etc. Pour notre exemple, cela donne :

regex-libreoffice-replace
Rechercher/Remplacer sous LibreOffice

Et on obtient le même résultat qu’avec R.

Pour Word la fonction de recherche/remplacement avancée est basée sur une syntaxe assez différente, appelée fréquemment wildcards. Elle est moins pratique sur certains aspects, mais permet bien de décrire le formattage du texte (italique, gras, etc.) – voir la documentation ici.

Conclusion

Voilà, vous êtes maintenant équipé pour transformer le texte de départ en un tableau de données ou un dataframe, avec les expressions régulières. Vous pouvez vous entraîner, par exemple en R, à créer un dataframe dont les variables (colonnes) seraient l’année de naissance, le mois de naissance, mais aussi le sexe, et le département voire le pays de naissance, de chaque individu.

Dans des prochains billets, on verra comment traiter des cas plus complexes, en termes d’éléments de syntaxe mais aussi d’outils logiciels pour aider à appréhender des regex complexes.


  1. Sélectionner manuellement l’année dans une ligne et en effacer le reste prendra quelques secondes, en fonction de la maîtrise des raccourcis clavier par l’opérateur. Pour quelques cas c’est acceptable, mais pour mille cas cela revient facilement à plusieurs heures, sans compter l’épuisement de l’opérateur. En revanche, écrire le “programme” nécessaire pour le faire de manière automatisée prend quelques dizaines de secondes, et l’exécution est quasiment instantanée.  ↩

  2. Le terme français considéré plus correct, mais presque jamais employé, est celui d’expressions rationnelles.  ↩

  3. Le nom de PCRE signifie Perl-Compatible Regular Expressions. Cette dénomination est le nom d’une syntaxe d’expressions régulières compatibles avec celles de Perl, un langage créé dans les années 1980 précisément pour faire des manipulations de texte, et qui a longtemps été la référence dans ce domaine. En fait deux syntaxes sont disponibles en R, POSIX et PCRE, mais la base est la même. Celle de Word est assez différente, et plus restreinte, mais il utile de la connaître ou au moins de savoir ce qu’on peut en faire; on l’évoquera prochainement.  ↩

  4. Les groupes de caractères sont aussi appelés classes de caractères.  ↩

  5. La raison en est qu’on écrit les regex sous la forme de chaînes de caractères, qui ont une syntaxe pour écrire certains caractères spéciaux (proche de celle mentionnée ici pour les caractères spéciaux des regex), que R interprète ensuite pour y lire la “vraie” chaîne de caractères que l’on a voulu exprimer. Comme le backslash (\) est l’un de ces caractères spéciaux, et qu’on écrit justement les caractères spéciaux en les faisant précér eux-mêmes d’un backslash, la syntaxe pour communiquer un backslash à R dans une chaîne de caractères est \\ (i.e. "… \\ …"). Pour voir comment R interprète les chaînes de caractères, on peut utiliser la fonction cat() : essayer par exemple cat("\"), cat("\\"), cat("\d"), cat("\\d").  ↩

  6. Plus précisément stringi est basé sur la syntaxe ICU, mais qui est très proche de PCRE.  ↩

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website

Enlever les accents (avec R)

En travaillant dans un langue autre que l’anglais, on est souvent amené à fréquenter des caractères exotiques : lettres munies d’accents (é), tildes (ñ), ronds (Å) et autres barres (ø) – sans compter les formes non-latines (de ∆ à भैं, en passant par ش). Mais comme l’informatique moderne a été développée avec des claviers étas-uniens, leur traitement ne va pas sans difficultés.

Des procédures standardisées, dites d’encodage, permettent d’utiliser ces caractères dans des textes ou des bases de données. Toutefois, dans le cas du français, le plus simple est bien souvent d’enlever les accents, si bien sûr on ne perd pas d’information cruciale au passage.

R permet d’effectuer cette opération, grâce à la fonction iconv munie d’une option de translittération : é est ainsi transformé en ´e, par exemple. On enlève ensuite les apostrophes (et équivalents) pour compléter la procédure de désaccentuation. Pour le faire de manière systématique, on définit la fonction suivante:

Unaccent <- function(text) {
  text <- gsub("['`^~\"]", " ", text)
  text <- iconv(text, to="ASCII//TRANSLIT//IGNORE")
  text <- gsub("['`^~\"]", "", text)
  return(text)
}

Il suffit d’exécuter ces quelques lignes au début d’un script R et cette fonction Unaccent devient disponible pour toute la suite de votre programme. Trois remarques:

  • Elle ne fonctionne que pour les caractères latins.
  • Les apostrophes et guillemets anglais sont également évacués, et remplacés par des espaces.
  • Vous venez de créer une fonction en R, un outil très utile qui permet d’empaqueter un ensemble d’instructions (éventuellement long) plutôt que de les réécrire à chaque fois.

Son utilisation donne ainsi :

> Unaccent("à é î ø ü ç ß ñ ƒ")
[1] "a e i o u c ss n f"

> Unaccent("J'ai dévoré les Grundriße")
[1] J ai devore les Grundrisse

Attention, les caractères non-latins sont purement et simplement effacés :

> Unaccent("∆")
[1] ""

Il est possible de travailler en gardant l’ensemble des caractères et des accents, mais cela nécessite d’être extrêmement soigneux dans la manipulation des encodages, voire des expressions régulières. Ces sujets, très techniques, seront abordés prochainement. Mais si vous pouvez y échapper, profitez-en !

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website

Comment on écrit le web : structure du langage HTML (1)

La collecte automatisée de données sur le web consiste à ordonner à un programme d’aller sélectionner des informations bien précises dans une série de pages. Ce billet est une brève introduction à la structure du langage HTML, dans lequel ces pages sont écrites. On aborde les pages simples (la grande majorité d’entre elles), et on abordera plus tard les les pages plus complexes, ainsi que les évolutions contemporaines du langage.

Quel rapport entre un navigateur et le HTML ?

Des visualisateurs de code HTML

Que se passe-t-il quand on utilise le web, par exemple quand vous venez visiter la page de ce billet ? Vous utilisez un navigateur, vous tapez l’adresse de la page, vous pressez entrée ; et après ?

L’adresse est celle d’un serveur, un ordinateur allumé tout le temps, et appuyer sur entrée revient à lui demander une page particulière. Le serveur nous renvoie alors la page demandée sous forme d’un fichier écrit en HTML : il s’agit d’un langage informatique simple, qu’on va préciser dans une seconde[1].

Votre navigateur reçoit ensuite ce fichier HTML, qu’on appelle le code source de la page et le transforme en une page mise sous une forme lisible et graphique, que vous avez sous les yeux.

Le langage HTML est donc une manière de décrire des instructions typographiques pour les pages du web. Il s’est imposé grâce à sa relative simplicité d’écriture et d’interprétation (pour les concepteurs de navigateurs).

Comme la collecte automatisée de données sur internet consiste souvent à demander à un programme de récupérer des informations dans une série de pages web, c’est-à-dire dans des pages écrites en HTML, il nous faut savoir comment désigner dans ce langage les informations qui nous intéressent.

Tout ce qui apparaît régulier dans le navigateur, doit être régulier dans le code source

Un principe fondamental de la collecte automatisée de données est ainsi le suivant : si on observe une certaine régularité formelle sur une page web affichée par un navigateur, alors celle-ci doit exister dans le code source de la page. Dans l’imprimerie de système Gutenberg, si on voit des lignes (de texte), c’est que l’imprimeur a utilisé des outils pour créer des lignes (des suites de caractères métalliques de même hauteur). Ici, si on voit à l’écran des blocs de texte similaires alors, comme le navigateur ne fait que traduire visuellement le code source, on doit très probablement trouver des instructions similaires qui correspondent à ces blocs de texte dans le code source.

La structure du langage

Les balises HTML

Le HTML est un langage assez facile d’accès. Son nom est explicite, HyperText Markup Language : HyperText signifie qu’il y a des liens cliquables, et Markup signifie « balises ». C’est donc un langage de balises (avec des liens cliquables). Le point principal est donc de comprendre la notion de balises et l’usage qu’il y en est fait.

Une structure en arbre

Les balises sont de la forme suivante :

<typeBalise>
    Contenu
</typeBalise>

Trois éléments sont présents : un couple de balises ouvrante et fermante, leur type, et un contenu entre les deux. Ce contenu peut être du simple texte, mais aussi d’autres balises. Ainsi une page HTML a toujours une structure de la forme suivante :

<tronc>

    <branche>

        <sousBranche>
            contenu_1.1
        </sousBranche>

        <sousBranche>
            contenu_1.2
        </sousBranche>

    </branche>

    <branche>
        contenu_2
    </branche>

</tronc>

C’est donc une structure en arbre, exactement comme un texte avec des parties et des sous-parties – à la différence que celles-ci peuvent être de plusieurs types : pour poursuivre l’analogie, comme dans les textes de philosophie analytique ou de mathématiques, texte principal, scolie, lemme, démonstration, figues, etc.

En HTML, les balises peuvent être d’un ensemble limité de types, qui correspondent à des instructions typographiques : div = bloc, a = lien, etc. ; <tronc>, <branche>, <sousBranche> et <typeBalise> n’existent pas en réalité[2].

Les espaces et sauts de ligne n’ont pas d’importance, on n’adopte cette présentation que pour le rendre plus lisible ; le code suivant a la même signification :

<tronc>
    <branche>
        <sousBranche>contenu_1.1</sousBranche>
        <sousBranche>contenu_1.2</sousBranche>
    </branche>
    <branche>contenu_2</branche>
</tronc>

On pourrait même écrire tout à la suite, en enlevant tous les espaces et sauts de ligne ci-dessus, ce serait inintelligible mais techniquement correct.

Les attributs de balises

Remarquez que jusqu’ici, seuls les types des balises sont présents, elle n’ont pas d’identifiant particulier, et rien ne permet de différencier la première branche de la deuxième, si ce n’est qu’elle est placée avant dans le code – ce qui est un moyen réel de l’identifier, bien que pas très pratique. C’est l’intérêt des attributs de balises.

En effet, les balises peuvent s’écrire plus complètement de la façon suivante, par exemple pour une balise de type div :

<div class="titre_1">
    Texte, sous-branches…
</div>

Dans la balise ouvrante, on peut ajouter des attributs, qui servent à enrichir leur description et à faciliter leur identification. Dans la page actuelle, vous pouvez vérifier que les titres de deuxième niveau sont repérés par des balises <div class="h2">. Un autre exemple est celui des liens hypertexte, qui sont décrits par des balises a, avec l’adresse indiquée comme attribut href (hypertext reference) ; voici comment on écrit ce lien renvoyant vers cette page :

<a href="http://data.hypotheses.org/243">
    lien renvoyant vers cette page
</a>

Ce qui identifie une balise

On a ainsi les trois éléments pour identifier une balise, qui sont :

  • Son type (div, p, a, etc.),
  • Ses attributs éventuels (class, attr, href, etc.),
  • Le contenu de texte et les sous-branches qui y naissent.

Pour des branches (ou sous-branches) formellement identiques, comme dans l’exemple vu précédemment, il nous reste l’ordre dans lequel celles-ci apparaissent dans le code HTML.

Avec ce système d’identification, on aura toujours au moins une manière, et souvent plusieurs, de repérer une ou plusieurs balises, celles dont on voudra collecter automatiquement les données.

Dans la pratique

La tête et le corps

La structure d’un fichier HTML est standardisée. Elle est de la forme :

<!DOCTYPE html (…)>
<html>
    <head>
        <meta> …
        <meta> …
        <link type="text/css" href="http://…">
    </head>
    <body>
        <div>
            <h1> Titre </h1>
            <p>
                Texte 
            </p>
        </div>
        …
    </body>        
</html>

La première ligne (DOCTYPE) désigne la version du langage HTML que la page utilise. On n’aura jamais à s’en servir. Ensuite le contenu de la page est situé entre les balises html. Ce tronc se divise en deux branches : head, puis body.

La branche head contient un ensemble d’informations sur la page (balises meta), des instructions de mise en page (chargées avec link), etc., mais aucun contenu affiché.

Toutes les informations affichées, comme le texte, les images, sont décrites dans la partie body.

Les balises réelles courantes

Celui-ci est construit avec les balises du langage. Il n’est pas indispensable de les connaître pour faire de la collecte automatisée de données. À titre indicatif voici le plus courantes :

  • <div> : un bloc rectangulaire de la page, contenant du texte ou des images ; souvent l’attribut class (ou parfois id) est présent ;
  • <a> : un lien hypertexte, renvoyant vers l’adresse indiquée par l’attribut href ;
  • <h1>, <h2>, <h3>, etc. : des titres, de niveaux décroissants ;
  • <p> : un paragraphe de texte ;
  • <ul>, <ol> : une liste, respectivement sans et avec numérotation ;
  • <img> : une image ;
  • <!-- … --> : un commentaire, c’est-à-dire du texte que le navigateur ignore.

Il existe d’autres balises, et chaque nouvelle version du langage en apporte pour simplifier l’écriture et étendre les fonctionnalités disponibles (voir l’histoire du HTML). De nombreux manuels existent en ligne. Le plus simple est de vous y référer si besoin, ou simplement de rechercher sur un moteur de recherche la signification d’une balise, comme le font tous les programmeurs.

Comment se fait la mise en page (facultatif)

Pour être complet, mentionnons, sans rentrer dans les détails, qu’il existe deux manières de préciser les instructions de mise en page – par exemple pour un bloc <div> : ses dimensions, sa couleur de fond, etc.

La première manière est de spécifier ces instructions comme attributs de la balise, directement dans le code HTML, par exemple : <div style="width:100px;border:1pxsolidblack">. Le HTML des années 1990 est écrit de cette manière lourde et pédestre, et on rencontre encore des pages sous cette forme.

La seconde consiste à utiliser une feuille de style, au format CSS. Dans ce cas, on précise dans le HTML un attribut du bloc, par exemple <div class="grand"> ; et dans un autre fichier, on précise les propriétés des blocs div possédant l’attribut class ayant la valeur grand, de manière générique. On peut ainsi en écrire plusieurs sans avoir à préciser à chaque fois les propriétés graphiques.

Dans ce dernier cas, la page web ne se résume donc pas au code HTML, mais est la résultante aussi de la feuille de style (CSS). De manière générale, une page web est décrite par un ensemble de fichiers, dont le HTML est le centre et contient quasiment toutes les informations affichées à l’écran.

Faire le lien entre le contenu affiché et le code source

Visualiser le code source

Une fois arrivé là, le code source d’une vraie page ne devrait plus rien avoir d’effrayant. Pour voir le code de cette page, demander à votre navigateur “Montrer le code source” ; le raccourci clavier est souvent Cmd-U (Mac) ou Ctrl-U (Windows), en ajoutant éventuellement Alt à cette combinaison (Safari ou Chrome, et ça dépend des versions) ; si vous ne trouvez pas, chercher “source” dans l’aide du logiciel.

Vous devriez obtenir une fenêtre un peu terne, mais qui permet quand même de vérifier ce qu’on vient de présenter.

Cela dit, ce n’est pas commode à lire. Pour disposer d’outils plus puissants et confortables, on vous encourage très vivement à installer Firebug pour Firefox, ou activer les outils de développeur, pour Safari (dans les préférences, menu “Avancées”, option “Afficher le menu Développement”) ; ou bien pour Chrome ouvrir les “Outils de développement”. Le raccourci clavier est souvent Cmd/Ctrl-(Alt)-I.

Ainsi, normalement, vous obtenez quelque chose de ce genre-là :

Inspecteur web de Safari

À quel morceau de code correspond un élément affiché ?

Plutôt que de chercher à l’aveuglette à quel morceau de code correspond un élément affiché, on peut utiliser l’inspecteur web. Cliquez sur l’icone en forme de main ( Safari), de rectangle avec une flèche ( Firebug) ou de loupe ( Chrome), puis promenez votre curseur sur les éléments de la page qu’il vous intéresse de connaître : des zones de la page doivent se colorer en bleu. Cliquez ensuite sur un élément, et l’inspecteur web vous indique où se trouve son équivalent dans le code HTML.

On peut alors observer ce qu’on annonçait au début de ce billet, à savoir que les éléments qui sont affichés de la même manière existent, dans le code source, de façon également similaire. Testez-le par exemple sur la colonne « liens », dans la colonne de droite de cette page :

Une fois qu’on a repéré où sont, dans le code source, les informations que l’on veut récupérer, la moitié du chemin est fait. Il reste à savoir comment faire comprendre cette localisation à un programme ; pour cela, on utilisera la syntaxe XPath, qui fera l’objet d’un prochain billet.


  1. Certaines pages sont écrites, totalement ou partiellement, en PHP, un autre langage qui permet d’étendre les fonctions du HTML, et notamment faire communiquer l’utilisateur avec une base de données : cela est utile pour créer des formulaires, par exemple. Le principe est globalement le même : notre navigateur envoie une requête, et le serveur nous renvoie du HTML. Il existe encore d’autres langages pour ajouter des fonctions au HTML, comme le javascript, mais dans quasiment tous les cas on peut se dispenser de les connaître.  ↩
  2. En XML, qui est un cousin du HTML, tous les types sont autorisés.  ↩

Alexandre Hobeika

Docteur en sociologie politique de l’EHESS, CMH-ETT

More Posts - Website