PDA

Afficher la version complète : [Réglé] Extraction de données d'une page html



ygnobl
13/08/2016, 17h39
Bonjour, je cherche à écrire un petit script shell pour récupérer du contenu d'une ou plusieurs page web.

Le problème est simple. J'ai à récupérer le contenu de balises ayant le même class, et étant les seules à l'avoir.
Cette partie là, je gère avec un grep et un cut pour avoir le bout que je cherche.

Là où ça devient plus dur, c'est qu'il peut y avoir plusieurs pages. Dans tous les cas, il y a à la fin des données un bout de code :
<span class="count" id="pag_count">x of y</span>
et le nom de la page à dl pour avoir la suite se déduit de la valeur de x.

Du coup, si quelqu'un a une idée de comment je pourrais :

Extraire les valeurs x et y de la page.
Appliquer une formule arithmétique à x afin de calculer le nom de la page suivante.


Merci d'avance pour vos idées. Je sais que ce serait plus simple d'utiliser un "vrai" langage comme python, mais le but est de me familiariser avec les côtés obscurs du bash.

niuxe
16/08/2016, 01h15
Merci d'avance pour vos idées. Je sais que ce serait plus simple d'utiliser un "vrai" langage comme python, mais le but est de me familiariser avec les côtés obscurs du bash.

Désolé, Je peux pas tellement t'aider. Je suis une quiche en bash. De mon côté, je t'aurais donné une solution en php.

1. regarde du côté des RegEx.
2. substr (http://php.net/manual/fr/function.substr.php) (en bash, je ne connais :( )

Ça devrait t'aider. ;)

niuxe
17/08/2016, 23h15
Arf, je me réponds à moi même et également à ta réponse.

Pourquoi n'utilises tu pas une techno tierce comme le python ou le php et tu récupères le contenu pour le traitement en bash. Le principal est d'arriver à ses fins n'est ce pas ?

En php, regarde du côté de "simple dom html". Voir carrément en natif avec l'objet DOM. Fait une petite recherche sur glouglou. tu vas trouver facilement.


<<<EDIT
je pense même qu'avec NodeJS et le javascript, tu peux arriver à tes fins aussi
EDIT;

J'espère que mon aide te sera utile :)

à plus

ygnobl
19/08/2016, 11h48
Désolé, je suis raciste des langages. PHP et Javascript, je peux pas encadrer et je vais pas troller ces langages. Python, j'ai rien contre, mais je viens juste de commencer à découvrir <hs class="disgression">et je cherche des tutos pour python3 qui sortent de l'ordinaire, parce que j'ai des problèmes avec les tutos "standards" qui reprennent vraiment de la base. Comme j'ai déjà les bases, le bon vieux hello world m'ennuie et je zappe les premiers chapitres, et souvent je finis par m'y perdre...</hs>

Antoine
19/08/2016, 15h06
Salut,

Tu peux utiliser xpath (https://fr.wikipedia.org/wiki/XPath) pour localiser ta balise. Il y a des implémentations dans pleins de langages. Pour du shell, tu peux directement utiliser les commandes xpath (c'est du Perl dessous) ou xmllint (du C je pense).

Par exemple avec xmllint, ce que tu cherches devrait pouvoir se faire avec :

xmllint --html --xpath "//span[@id='pag_count']" ton_fichier.html

Tu peux ensuite le passer par grep pour récupérer les numéros. Un exemple de script qui prend en arguments des fichiers HTML :


#!/bin/bash

XPATH="//span[@id='page_count']"
XPRGM="xmllint"
XARGS="--html --xpath $XPATH"

if [ $# -lt 1 ]; then
echo "Syntax: $0 file.html [file2.html file3.html…]"
exit 1
fi

for file in $@; do
RESULT=""
if [ -f $file ]; then
# On récupère la page actuelle et le nombre de page dans le tableau RESULT
RESULT=($($XPRGM $XARGS "$file" | grep -oE "[0-9]*"))
echo "Current page is ${RESULT[0]}"
echo "Number of pages is ${RESULT[1]}"
if [ ${RESULT[0]} -ne ${RESULT[1]} ]; then
# Pour faire une somme en bash
echo "Next page is $(expr ${RESULT[0]} + 1)"
fi
else
echo "$file does not exist"
fi
done

Après, xmllint risque de te jeter avec du HTML (http://stackoverflow.com/questions/21479855/using-xmllint-and-xpath-with-a-less-than-perfect-html-document/). Tu peux alors essayer de nettoyer le HTML ou d'utiliser un autre outil (xidel (http://www.videlibri.de/xidel.html) a l'air de bien gérer l'HTML, pas testé).

À+

ygnobl
07/09/2016, 01h41
Après, xmllint risque de te jeter avec du HTML (http://stackoverflow.com/questions/21479855/using-xmllint-and-xpath-with-a-less-than-perfect-html-document/). Tu peux alors essayer de nettoyer le HTML ou d'utiliser un autre outil (xidel (http://www.videlibri.de/xidel.html) a l'air de bien gérer l'HTML, pas testé).

Désolé, j'ai mis un peu de temps à répondre, mais j'ai malheureusement été distrait de cette question par d'autres qui m'ont été posées. Du coup, merci pour xmllint et les requêtes xpath. Je ne connaissait pas du tout, et c'est si pratique que je vais vite en devenir gaga :) . Pour ce qui est du rendu avec du html, un petit coup de tr et de cut pour récupérer les infos que je cherche dans la page, et c'est parti ! J'ai pu écrire mon parser de données en 4 lignes de bash avec ça.

Encore merci pour ce truc, il est vraiment d'enfer.

Antoine
07/09/2016, 17h57
Avec plaisir ;) à+