web-dev-qa-db-fra.com

Comment analyser des centaines de fichiers de code source HTML dans Shell?

J'ai quelques centaines de fichiers de code source HTML. J'ai besoin d'extraire le contenu d'un <div> Élément de chacun de ces fichiers pour que je vais écrire un script pour boucler chaque fichier. La structure de l'élément est comme ceci:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

Quelqu'un peut-il suggérer une méthode par laquelle je peux extraire la div the_div_id et tous les éléments enfants et contenu d'un fichier à l'aide de la ligne de commande Linux?

23
conorgriffin

Essayez pup , un outil de ligne de commande pour traiter HTML. Par exemple:

pup '#the_div_id' < file.html
13
Trevor Dixon

Voici un script perl non testé qui extrait <div id="the_div_id"> éléments et leur contenu en utilisant HTML::TreeBuilder .

#!/usr/bin/env Perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
        my $html = $subtree->as_HTML;
        $html =~ s/(?<!\n)\z/\n/;
        print $html;
    }
    $tree = $tree->delete;
}

Si vous êtes allergique à Perl, Python a HTMLParser .

P.s. N'essayez pas d'utiliser des expressions régulières. .

Voici une one-liner pour extraire cette pièce de chaque fichier:

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

Pour enregistrer/remplacer en place, changez -cqa! dans -cxa et supprimer %p section. Pour la récursivité, envisagez d'utiliser Globbing (**/*.html).

Fondamentalement pour chaque tampon/fichier (bufdo), il fait les actions suivantes:

  • /pattern - trouver le motif
  • norm - Démarrez simulant la simulation de VI Keystrokes [.____]
    • n - passer dans le motif suivant (requis en mode EX)
    • vatd - Retirez la section Étiquette extérieure sélectionnée (voir: Sauter entre les balises HTML )
    • ggdG - retirez tout le tampon (équivalent à :%d)
    • "2p - re-coller le texte supprimé précédemment

Peut-être pas très efficace et pas POSIX (:bufdo), mais cela devrait fonctionner.

1
kenorb