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.
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>
en utilisant sed dans shell / bash, donc vous n'avez pas besoin d'installer autre chose.
tag=body
sed -n "/<$tag>/,/<\/$tag>/p" file
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.
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'\'')'
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
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.