10
votes

Comment extraire-je un élément HTML basé sur sa classe?

Je commence juste à partir à Perl et j'ai écrit un script simple pour faire une gratte Web. J'utilise www :: Mécaniser et HTML :: TreeBuilder pour faire la plupart des travaux, mais j'ai eu des problèmes. J'ai le suivant HTML:

my $tree = HTML::TreeBuilder->new_from_url( $url );
my @data = $tree->find('td class = "wins"');


0 commentaires

4 Réponses :


6
votes

J'utilise excellent (mais un peu lent parfois) html :: TreeBuilder :: XPath code> Module:

my $tree = HTML::TreeBuilder::XPath->new_from_content( $mech->content() );
my @data = $tree->findvalues('//table[ @class = "winsTable" ]//td[@class = "wins"]');


0 commentaires

10
votes

Vous pouvez utiliser la méthode code> code> pour trouver la balise et les attributs spécifiques que vous recherchez. Ceci est dans le module HTML :: ELEMENT CODE> (qui est importé par HTML :: TreeBuilder code>).

my $data = $tree->look_down(
    _tag  => 'td',
    class => 'wins'
);

print $data->content_list, "\n" if $data; #prints '15' using the given HTML

$data = $tree->look_down(
    _tag  => 'td',
    class => 'losses'
);

print $data->content_list, "\n" if $data; #prints nothing using the given HTML


1 commentaires

J'utilise le même scénario, mais iam Obtenir l'erreur suivante: nombre impair d'éléments dans la mission de hachage à /usr/local/share/perl5/html/treebuilder.pm ligne 207



1
votes

(C'est une sorte de réponse supplémentaire à Dspain's )

En fait, vous avez manqué une place dans le HTML :: TreeBuilder Documentation où il est écrit,

Objets de cette classe héritent des méthodes de HTML :: Parser et HTML :: Élément. Les méthodes héritées de HTML :: analyseur sont utilisées pour la construction de l'arborescence HTML et les méthodes héritées de HTML :: Elément sont ce que vous utilisez pour scruter l'arborescence. Outre cette documentation (HTML :: TREBERBUILDER), vous devez également lire attentivement la documentation HTML :: Elément , et également écrémer la documentation HTML :: Parser - probablement uniquement ses méthodes d'analyse et d'analyse. .

(Notez que la mise en forme audacieuse est la mine, ce n'est pas dans la documentation)

Cela indique que vous devriez lire HTML: : La documentation de l'élément aussi, où vous trouverez le Recherche méthode qui dit

Ceci est juste un alias à la recherche_by_tag_name

Cela devrait vous dire qu'il ne fonctionne pas pour les noms de classe, mais sa description mentionne également un look_down méthode qui peut être trouvé légèrement plus bas. Si vous regardez l'exemple, vous verriez que cela fait ce que vous voulez. Et La réponse de Dspain montre précisément comment dans votre cas.

Pour être juste, la documentation n'est pas si facile à naviguer.


0 commentaires

0
votes

J'ai trouvé le Ceci Link le plus utile pour me dire comment extraire des informations spécifiques du contenu HTML. J'ai utilisé le dernier exemple sur la page:

use v5.10;
use WWW::Mechanize;
use WWW::Mechanize::TreeBuilder;

my $mech = WWW::Mechanize->new;
WWW::Mechanize::TreeBuilder->meta->apply($mech);

$mech->get( 'http://htmlparsing.com/' );

# Find all <h1> tags
my @list = $mech->find('h1');

# or this way <----- I found this way very useful to pinpoint exact classes with in some html
my @list = $mech->look_down('_tag' => 'h1', 
                            'class' => 'main_title');

# Now just iterate and process
foreach (@list) {
    say $_->as_text();
}


0 commentaires