2010-12-27 15 views
0

Ich muss einige Daten von Webseiten parsen. Wie extrahiere ich Text zwischen Tags mit HTML :: Parser?Wie kann ich mit HTML :: Parser Text zwischen Tags extrahieren?

Betrachten Sie den folgenden Beispielcode:

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::Parser; 
use Data::Dumper; 

my $find_title = HTML::Parser->new(
    api_version => 3, 
    start_h => [ 
     sub { 
      my ($tag, $attr) = @_; 
      print Dumper \@_; 
      }, 
     'tag' 
       ], 
); 

my $html = join '', 
    "<html><head><title>Extract me!</title></head><body>", 
    (map { qq(<a href="http://$_.com">$_</a>) } qw/foo bar baz/), 
    "</body></html>"; 

$find_title->report_tags('title'); 
$find_title->parse($html); 

Wie behebe ich dies, so kann ich den Titel extrahieren? Dies extrahiert nur das Tag.

Antwort

0

Sie benötigen einen Handler text_h, um den Text zu sammeln, und einen Handler end_h, der etwas unternimmt, wenn das Tag </title> erscheint (zu diesem Zeitpunkt wurde der Text innerhalb des Tags gesammelt).

HTML :: Parser ist ein ziemlich niedriges Modul, Sie können glücklicher mit einem der vielen Module sein, die darauf gebaut werden, wie HTML::TreeBuilder oder HTML::TokeParser.

Zum Beispiel macht HTML::HeadParser die Titelextraktions trivial:

use strict; 
use warnings; 

use HTML::HeadParser; 

my $html = join '', 
    "<html><head><title>Extract me!</title></head><body>", 
    (map { qq(<a href="http://$_.com">$_</a>) } qw/foo bar baz/), 
    "</body></html>"; 

my $p = HTML::HeadParser->new; 
$p->parse($html); 

my $title = $p->header('Title'); 
Verwandte Themen