bash: obtenir du contenu entre deux balises HTML

j'ai besoin d'obtenir le contenu HTML entre une paire de balises données en utilisant un script bash. Par exemple, avoir le code HTML ci-dessous:

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

en utilisant la commande bash / script, étant donné le corps balise, on obtient:

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

Merci à l'avance.

10
demandé sur Joao 2014-01-09 12:56:56

6 réponses

le traitement de texte en clair 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>
10
répondu Kent 2014-01-09 09:06:08

en utilisant sed dans shell / bash, donc vous n'avez pas besoin d'installer autre chose.

tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file
7
répondu BMW 2014-01-11 04:34:43

Personnellement, je trouve qu'il est très utile d'utiliser hxselect commande (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 des sélecteurs CSS pour obtenir le(s) noeud (s) dont vous avez besoin. Avec l'utilisation de la -c option, il supprime les tags environnants. Toutes ces commandes fonctionnent sur stdin et stdout. Donc, dans votre cas, vous devez 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. La plaine et simple.

7
répondu Cromax 2017-02-17 20:26:28

oublier Bash due c'est une limitation, vous pouvez utiliser nokogiri comme ligne de commande util, comme expliqué ici.

Exemple:

curl -s http://example.com/ | nokogiri -e 'puts $_.search('\''a'\'')'
4
répondu Paulo Fidalgo 2014-01-09 17:50:59

une autre option est d'utiliser la multi-plateforme xidel utilitaire ( page d'accueil sur SourceForge,GitHub), qui peut gérer à la fois XML et HTML:

xidel in.html  -e '/html/body/node()' --printed-node-format=html
3
répondu mklement0 2018-03-02 13:53:14

BASH est probablement le mauvais outil pour cela. Essayez un script Python en utilisant le puissant Belle Soupe bibliothèque à la place.

il y aura plus de travail à l'avance mais à long terme (ici: après une heure), les économies de temps compenseront l'effort supplémentaire.

0
répondu Aaron Digulla 2014-01-09 09:21:43