Portál AbcLinuxu, 2. června 2024 12:39

Validace HTML pomocí crawleru

7.1.2010 22:21 | Přečteno: 997× | programování | poslední úprava: 7.1.2010 22:30

Minule jsem si hrál s validací HTML v automatizovaných testech. Jsem s ní spokojený, jen se ukázalo, že by bylo dobré validovat celý web. A navíc nejen validovat – rád bych při každém spuštění testů zkontroloval, jestli mi někde nevisí linky a podobně. Napadlo mě tedy napsat malý crawler, který by web prošťáral a podle potřeby zkontroloval.

Základem kódu je třída WWW::Mechanize, kolem které se dá crawler napsat na pár řádků kódu:
package Test::Crawler;

use Moose;
use WWW::Mechanize;
    
has client => (
    is => 'ro',
    isa => 'WWW::Mechanize',
    default => sub { WWW::Mechanize->new },
);

has handler => (
    is => 'ro',
    isa => 'CodeRef',
    default => sub {},
);

sub crawl
{
    my ($self, $url, $visited) = (@_, {});

    # Already seen that.
    return if $visited->{$url}++;

    # Not seen yet, get.
    $self->client->get($url);
    $self->handler->($url, $self->client);

    # Follow all links.
    my @uris = map { $_->URI } $self->client->links;
    for my $uri (@uris) {
        # Skip mailtos, ftp and such.
        next if $uri->scheme;
        # Skip external links.
        next if $uri->host;
        $self->crawl($uri->rel, $visited);
    }
}

1;
Pak už stačí crawler pustit v rámci testu a do handleru napsat kód pro validaci HTML a cokoliv dalšího. Pro začátek kontroluju visící odkazy:
use Test::More;
use Test::Crawler;
use Test::WWW::Mechanize::Catalyst;

sub handle_link {
    my ($url, $mech) = @_;
    ok $mech->response->is_success, "failed to fetch: $url";
}   

my $mech = Test::WWW::Mechanize::Catalyst->new(catalyst_app => 'Foo');
Test::Crawler->new(client => $mech, handler => \&handle_link)->crawl('/');
    
done_testing;
Už během psaní crawleru jsem našel pár chybných URL (dobře schovaných v dynamicky generovaném RSS feedu), takže podobný test se jistě užije. Jen pro tu validaci by asi doopravdy bylo dobré začít používat místní validátor, abych nespamoval online služby.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.