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?
Essayez pup
, un outil de ligne de commande pour traiter HTML. Par exemple:
pup '#the_div_id' < file.html
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
.
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 motifnorm
- 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édemmentPeut-être pas très efficace et pas POSIX (:bufdo
), mais cela devrait fonctionner.