web-dev-qa-db-fra.com

Obtenir du contenu entre une paire de balises HTML à l'aide de Bash

Je dois obtenir le contenu HTML entre une paire de balises données en utilisant un script bash . À titre d'exemple, avec le code HTML ci-dessous:

<html>
<head>
</head>
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
</html>

En utilisant la commande/script bash, étant donné le body tag, nous obtiendrions:

 text
  <div>
  text2
    <div>
    text3
    </div>
  </div>

Merci d'avance.

11
Joao

le traitement de texte brut n'est pas bon pour l'analyse HTML/XML. J'espère que cela pourrait vous donner une idée:

kent$  xmllint --xpath "//body" f.html 
<body>
 text
  <div>
  text2
    <div>
        text3
    </div>
  </div>
</body>
11
Kent

Avec sed dans Shell/bash, vous n'avez pas besoin d'installer autre chose.

tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file
8
BMW

Personnellement, je trouve très utile d’utiliser la commande hxselect (souvent avec l’aide de hxclean) du paquet html-xml-utils. Ce dernier corrige (parfois cassé) le fichier HTML pour corriger le fichier XML et le premier permet d’utiliser les sélecteurs CSS pour obtenir le ou les nœuds dont vous avez besoin. Avec l'utilisation de l'option -c, il supprime les balises environnantes. Toutes ces commandes fonctionnent sur stdin et stdout. Donc, dans votre cas, vous devriez exécuter:

$ hxselect -c body <<HTML
  <html>
  <head>
  </head>
  <body>
    text
    <div>
      text2
      <div>
        text3
      </div>
    </div>
  </body>
  </html>
  HTML 

pour obtenir ce dont vous avez besoin. Clair et simple.

7
Cromax

Oubliant Bash à cause de sa limitation, vous pouvez utiliser nokogiri comme util de ligne de commande, comme expliqué ici .

Exemple:

curl -s http://example.com/ | nokogiri -e 'puts $_.search('\''a'\'')'
4
Paulo Fidalgo

Une autre option consiste à utiliser l'utilitaire multi-plateforme xidel ( page d'accueil sur SourceForge , référentiel GitHub ), qui peut gérer à la fois XML et HTML:

xidel in.html  -e '/html/body/node()' --printed-node-format=html
3
mklement0

BASH est probablement le mauvais outil pour cela. Essayez plutôt un script Python en utilisant la puissante bibliothèque Beautiful Soup .

Ce sera plus de travail au début, mais à long terme (ici: après une heure), les gains de temps compenseront l'effort supplémentaire.

0
Aaron Digulla