Quelle technologie pour parser du HTML ?

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille sur un projet universitaire pour lequel j'aurais besoin d'envoyer automatiquement une requête POST à un site web, récupérer la page HTML générée et parser le résultat pour extraire quelques mots ou phrases.

Connaîtriez-vous un outil ou un framework qui soit adapté à ce type d'usage ?

Merci !

+0 -0

Salut.

C'est tout à fait dans les cordes de Python. Selon tes contraintes, soit tu peux te permettre d'utiliser des modules tiers :

  • requests pour la requête POST
  • lxml pour parser la réponse

Soit tu peux composer avec la bibliothèque standard (en faisant ta requête avec urllib), mais le parsing sera un peu plus laborieux sans lxml.

+4 -0

Je n'ai pas de contraintes particulières donc je vais regarder les modules que vous m'avez conseillés.

Merci !

P.S. - Si d'autres personnes ont des suggestions différentes, qu'elles n'hésitent pas, je suis ouvert à tout.

+0 -0

Pour parser du HTML en python je partirais direct sur du BeautifulSoup.

Petit article de presentation (attention, le reste du site est un peu NSFW)

Nodraak

BeautifulSoup n'est qu'une surcouche de lxml. À l'usage je la trouve bien plus laborieuse à utiliser (sans même parler des perfs qui ne nous intéressent pas ici). Du coup j'aurais tendance à la proscrire : elle figure dans mon top 10 des "fausses bonnes idées", avec path.py.

+2 -0

Exemple en Groovy, récupérer tous les titres d'articles présents sur la page d'accueil :

1
2
3
4
5
6
7
8
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1')
import groovyx.net.http

def html= new HttpBuilder('http://zestedesavoir.com').get([:])

def articles = html."**".findAll { it.name() == 'ARTICLE' }
def titresArticles = articles.collect { it.A[0]?.@title }
println titresArticles

Y'a moyen de faire un "one-liner" mais bon, c'est déjà pas forcément évident à comprendre…

C'est typiquement le genre de trucs (rechercher récursivement dans un document XML) que les langages de script "modernes" fournissent des outils appropriés et généralement pas trop complexes à comprendre.

EDIT : la doc

+1 -0

Pour le fun :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
>>> import requests
>>> from lxml.etree import HTML
>>> page = requests.get("https://zestedesavoir.com")
>>> html = HTML(page.text)
>>> for title in html.xpath('//article/div[@class="content-info"]//h3'):
...     print(title.text.strip())
... 
D'Éden à Yggdrasil : l'arbre dans les mythes
Les arbres, sous toutes leurs formes
Cérémonie de la science improbable : présentation des IgNobels 2015
Les injections SQL
Vagrant, connexion SSH
Impression erronée
Appel d'une fonction depuis un autre fichier
Plusieurs ModelForm dans une page
Quelle technologie pour parser du HTML ?
Tablette DualBoot : Remettre à zéro

Après, évidemment, la version one-liner est imbitable :

1
[title.text.strip() for title in HTML(requests.get("https://zestedesavoir.com").text).xpath('//article/div[@class="content-info"]//h3')]
+1 -0

Marrant comme les versions Groovy et Python se ressemblent :)

(en même temps les deux reposent sur des XPath, d'ailleurs on pourrait écrire la version XPath également, plutôt que GPath).

PS : GPath c'est le ."**". pour ceux qui se demanderaient.

+1 -0

Ekron, dis-moi, tu as déjà codé, si oui, tu connais quoi comme langage(s) ? Il est impératif de le savoir, si tu veux des réponses exploitables.

J'ai l'impression que tu vas te lancer dans l'apprentissage d'un langage, celui qu'on t'aura le mieux vendu, dans le but d'implémenter ton script. Si tu n'as jamais programmé, ça risque d'être long (mais pourquoi pas!).

+2 -0

Wow, merci pour tous vos messages !

Alors, pour répondre globalement :

  • l'université ne donne pas de contrainte, en réalité, ce petit script est un partie d'un projet un peu plus gros, donc on fait comme on veut ;
  • j'ai déjà codé, et je pense me débrouiller pas trop mal en Java, C# et en web (PHP, Javascript…). J'ai fait un peu de Python aussi et dans la mesure où ce que je cherche à faire n'est pas très compliqué, je pense que je pourrais m'en sortir avec.

En tout cas, merci encore à tout le monde, je vais me pencher sur ces solutions pour voir laquelle m'est le plus accessible ! :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte