2010-02-08 4 views

Répondre

3

Vous devriez également regarder Web::Scraper.
Je trouve ce module plus facile que les modules HTML :: Parser, mais cela aide si vous êtes familier avec XPath.
L'analyse HTML est très imprévisible en fonction des pages réelles - c'est comme l'affichage pdf et non orienté données.

4

L'approche de HTML :: Parser est basée sur des jetons et des rappels. Je trouve cela très pratique lorsque vous avez des conditions particulièrement complexes sur le contexte dans lequel les données que vous souhaitez extraire ou modifier se produisent.

Sinon, je préfère une approche basée sur les arbres. HTML::TreeBuilder::XPath (basé ultimement sur HTML :: Parser) vous permet de trouver des nœuds avec XPath. Il renvoie HTML::Element s. La documentation est un peu rare (enfin, répartie sur quelques modules). Mais toujours le moyen rapide d'extraire en HTML.

Si vous traitez avec du XML pur, XML::Twig est un parser exceptionnel: très bonne gestion de la mémoire, permet de combiner les approches arbre et flux. Et la documentation est très bonne.

3

Dites dans la page utilisateur StackOverflow de quelqu'un que vous souhaitez remplacer toutes les instances de PERL par Perl. Vous pouvez le faire avec

#! /usr/bin/perl 

use warnings; 
use strict; 

use HTML::Parser; 
use LWP::Simple; 

my $html = get "http://stackoverflow.com/users/201469/phil-jackson"; 
die "$0: get failed" unless defined $html; 

sub replace_text { 
    my($skipped,$markup) = @_; 
    $skipped =~ s/\bPERL\b/Perl/g; 
    print $skipped, $markup; 
} 

my $p = HTML::Parser->new(
    api_version => 3, 
    marked_sections => 1, 
    case_sensitive => 1, 
    unbroken_text => 1, 
    xml_mode => 1, 
    start_h => [ \&replace_text => "skipped_text, text" ], 
    end_h => [ \&replace_text => "skipped_text, text" ], 
); 

# your page may use a different encoding 
binmode STDOUT, ":utf8" or die "$0: binmode: $!"; 
$p->parse($html); 

La sortie est ce que nous attendons:

$ wget -O phil-jackson.html http://stackoverflow.com/users/201469 
$ ./replace-text >out.html 
$ diff -ub phil-jackson.html out.html 
--- phil-jackson.html 
+++ out.html 
@@ -327,7 +327,7 @@ 

PERL: 

-#$linkTrue = &hellip; ">comparing PERL md5() and PHP md5()</a></h3> 
+#$linkTrue = &hellip; ">comparing Perl md5() and PHP md5()</a></h3> 

     <div class="tags t-php t-perl t-md5"> 
      <a href="https://stackoverflow.com/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="https://stackoverflow.com/questions/tagged/perl" class="post-tag" title="show questions tagged 'perl'" rel="tag">perl</a> <a href="https://stackoverflow.com/questions/tagged/md5" class="post-tag" title="show questions tagged 'md5'" rel="tag">md5</a>

Le « PERL: » pouce endolori fait partie d'un attribut d'élément, et non une section de texte.

1

Le module que vous devez utiliser dépend de ce que vous essayez de faire. Pour commencer, HTML::Parser est livré avec de grands exemples qui comprennent également un script qui extrait du texte brut à partir d'un document HTML. N'essayez pas d'analyser des documents HTML à l'aide d'un analyseur XML: vous vous trouvez dans un monde de souffrance car beaucoup de constructions HTML valides ne sont pas des données XML valides. N'essayez pas d'analyser des documents XML à l'aide d'un analyseur HTML: vous perdrez tous les avantages de l'exigence plus stricte qu'un document XML soit bien formé avant de pouvoir être analysé.