Expression régulière recherche sur plusieurs ligne

Bonjour,

J’ai besoin de rechercher dans un document texte tous ce qui se trouve entre ‘<td id=’ et ’

J’ai donc écris cette expression test = re.findall("<td id=.*</td>", text) (je suis en python)

Seulement cette expression ne fonctionne pas car le texte qui se trouve entre ‘<td id=’ et ’ est sur plusieurs ligne. Or mon expression ne permet que de rechercher sur une seule ligne.

Quelqu’un peut m’aider à la modifier pour que la recherche soit bien effective sur plusieurs lignes?

Bonjour

Essaye avec re.MULTILINE docs.python.org/3/library/re.html#re.MULTILINE

Je viens d’éssayer

et

Aucun des deux ne fonctionne. Les lignes entre mes expressions sont toujours ignorées.

et au lieu de «.» tu mettais «[a-zA-Z0-9\n\t ]» comme ça tu y inclus explicitement les retours à la ligne et les tabulations.

Je pense que c’est plutôt re.DOTALL dont tu as besoin, pour inclure tous les caractères de saut de lignes, retour chariot, etc …

oui c’est bien re.DOTALL. :033

Si c’est un page HTML que tu parses, il existe plein de librairies plus haut niveau pour t’aider, à commencer par BeautifulSoup

Effectivement avec DOTALL je peux effectivement récupérer plusieurs ligne. Par contre le résultat obtenu n’est pas celui attendu :slightly_smiling:

En effet, j’ai plusieurs balises identiques qui se suivent,

<td id= [...] <td id= [...] <td id= [...] <td id= [...]

J’aurais voulu récupérer le contenu de chaque td dans un tableau or cette ligne re.findall("<td id=.*</td>", r.text, re.DOTALL) me récupère tout de la balise 1 à la balise X…

Oui c’est bien une page html qui est concernée. Je suis entrain d’essayer BeautifulSoup en parallèle de mes essais avec les regex mais pour l’instant je n’arrive à rien :slightly_smiling:

C’est parce que ton expression régulière est gloutonne.
Avec des balises HTML, cela se résout simplement :

( n’importe quel caractère sauf “<”, plusieurs fois ).

[quote=“Arnaud_”]C’est parce que ton expression régulière est gloutonne.
Avec des balises HTML, cela se résout simplement :

( n’importe quel caractère sauf “<”, plusieurs fois ).[/quote]

La mienne est peut être gloutonne mais la tienne ne me retourne rien du tout :slightly_smiling:

Ah bon ?

[code]import re

text = “”"

abc

abc

abc

abc

def ghi

ghi
ghi

"""

print(re.findall("<td id=[^<]*", text, re.DOTALL))

Affiche :

[‘abc\n\nabc\n\nabc\n\nabc’, ‘def’, ‘ghi\n\nghi\nghi’][/code]

Ce code fonctionne parfaitement chez moi ( python 3.5.1 ).

Voici un extrait de ce que j’essaie de récupérer :

[code]


» 27th Wednesday

Shadowhunters
Dead Man's Party
S: 1 - Ep: 3
Freeform - 3:00am

The Expanse
Salvage
S: 1 - Ep: 8
Syfy - 4:00am

The Shannara Chronicles
Reaper
S: 1 - Ep: 5
MTV - 4:00am

» 28th Thursday » 29th Friday

Legends of Tomorrow
Pilot, Part 2
S: 1 - Ep: 2
The CW - 2:00am

The 100
Wanheda (2)
S: 3 - Ep: 2
The CW - 3:00am

» 30th Saturday[/code]

Le site donne les horaires de diffusion de certaines séries. A terme je veux récupérer la date de diffusion, la chaine, le nom de la série, l’épisode, le numéro de la saison et le numéro de l’épisode.

Ce premier regex que je fais doit me donner tous ce qui se trouve dans la classe “day” afin que je puisse par la suite avec d’autre regex récupérer les infos qui m’intéressent.

Et la ton regex ne fonctionne pas. Après peut être que les expressions régulières ne marche pas pour faire ce que je veux…

Effectivement cela ne marche pas si tu veux récupérer des balises à l’intérieur du td.

On peut ôter l’effet glouton de cette façon :

Dans ton exemple, la dernière balise td n’est pas fermée correctement, donc cela ne renverra que 3 contenus.

Avec beautifulsoup.
Ref: sametmax.com/parser-du-html-avec-beautifulsoup/

from urllib2 import urlopen import bs4 as BeautifulSoup html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read() soup = BeautifulSoup.BeautifulSoup(html)

et après un truc comme

C’est quoi le lien de ton site?

[quote=“Arnaud_”]Effectivement cela ne marche pas si tu veux récupérer des balises à l’intérieur du td.

On peut ôter l’effet glouton de cette façon :

Dans ton exemple, la dernière balise td n’est pas fermée correctement, donc cela ne renverra que 3 contenus.[/quote]
Effectivement dans l’exemple elle n’est pas fermé mais sur le site elle l’est bien. En tous cas cette fois ta regex fonctionne.
Mais je ne la comprends pas trop. Le ? signifie 0 ou 1 je n’arrive pas a comprendre comment il agit sur cette règle…

[quote=“limax”]Avec beautifulsoup.
Ref: sametmax.com/parser-du-html-avec-beautifulsoup/

from urllib2 import urlopen import bs4 as BeautifulSoup html = urlopen('http://www.d8.tv/d8-series/pid6654-d8-longmire.html').read() soup = BeautifulSoup.BeautifulSoup(html)

et après un truc comme

C’est quoi le lien de ton site?[/quote]
Le site est ici : http://www.pogdesign.co.uk/cat/

Je viens de testé avec ta ligne de beautifulsoup et effectivement elle me ressort bien les infos qui m’intéressent. Seulement contrairement à la regex je me retrouve avec toutes les infos à la suite et non dans un tableau. Il est donc plus compliqué pour moi de récupérer les infos qui m’intéressent au final (voir mon post juste au-dessus). A moins que la beautifulsoup me permettent aussi d’aller piocher les infos qui m’intéressent.

Comme je l’ai dit, au final j’ai besoin d’extraire pour chaque épisode les infos suivantes : Date de passage, heure de passage, nom de la série, nom de l’épisode, chaine sur laquelle ça passe, numéro de la saison et numéro de l’épisode.

Dans ce cas, le “?” n’est pas à prendre tout seul, c’est la combinaison “*?” qui signifie : prendre la chaîne de taille minimale correspondant à la regexp.

Voir ici : docs.python.org/3.5/library/re.html

[quote]?, +?, ??
The '
’, ‘+’, and ‘?’ qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.> is matched against ‘

title

’, it will match the entire string, and not just ‘

’. Adding ‘?’ after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .

? in the previous expression will match only ‘

’.[/quote]

Que ce soit avec le module re ou BeautifulSoup, il faut du temps pour comprendre le fonctionnement, mais pour avoir un gain de temps considérable par la suite.
Dans le cadre de “webscraping”, il faut que tu t’attendes à ce que le site change de structure, ce qui t’obligera à t’adapter tout le temps.