Re: Parser du html en bash

Top Page

Reply to this message
Author: Sylvain Pogodalla
Date:  
To: Hugues Levasseur
CC: guilde
Subject: Re: Parser du html en bash
Bonjour à tous,

Hugues Levasseur writes:
> Mais dans mon cas, je ne veut pas réécrire Firefox en ligne de
> commande, je voudrait juste extraire une chaine d'un fichier. Une
> chaine qui commence par <div id="maCible"> et qui se fini au
> prochain </div> rencontré
>
> ... c'est peut-être plus dans les cordes des RegExp ?


En toute généralité : non (et c'est vrai pour les théoriciens comme
pour les praticiens :-).

Le langage des expressions bien parenthésées est un langage
hors-contexte et ne peut être décrit par une expression régulière
(voir l'utilisation du "pumping lemma" sur
http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages#Use_of_lemma).

Or, sélectionner ce qu'il y a entre 2 balises <div> et </div> qui se
correspondent c'est vérifier qu'un langage est bien parenthésé. Cela
ne peut donc pas se faire avec des expressions régulières (voir la
réponse
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1758162

Néanmoins, ton problème est peut-être plus simple (d'ailleurs tu dis
"au prochain </div> rencontré", ce n'est donc pas forcément celui qui
correspond au <div> ouvrant) :

+ si tu es sûr qu'il n'y aura pas de balise à l'intérieur d'une balise
<div>, tu peux essayer la solution envoyée par Yves (YP)

+ si tu es sûr qu'il n'y aura pas de balise <div> enchâssée, tu peux
essayer (ça attrape tout, y compris toutes les autres balises) :

grep -zoP '<div id="maCible">(?s).*</div>'

(le z c'est pour enlever que grep considère le caractère Newline comme
le caractère NUL, et le (?s) pour que le . inclue ce caractère
également. Les 2 ensembles permettent d'attraper un contenu qui ne
serait pas sur une seule ligne).


Sylvain