Perl - Механизировать? - Как получить все ссылки на странице до определенного текста «разделитель» - PullRequest
0 голосов
/ 18 октября 2011

Это модули, которые я установил.

use WWW::Mechanize;
use XML::Simple;
use LWP::Simple;
use Data::Dumper;
use Web::Scraper;
#use HTML::Grabber;

Я пытаюсь получить все ссылки, оканчивающиеся на '.com', вплоть до HTML-тега: '<div class="nogo_class">Proceed No More</div>', создающего массив из результатов.

Я посмотрел на различные примеры, которые я нашел здесь и в документации, но ничего такого не происходит. В любом случае, я ничего не могу обернуть вокруг себя.

Итак, используя модули, которые я установил, как я могу получить все ссылки, оканчивающиеся на '.com' до этой точки остановки: '<div class="nogo_class">Proceed No More</div>' в массив?

Итак, позже я могу получить ссылки с помощью цикла или чего-то еще. например, $somearray[$counter];

Я действительно неопытный и надеюсь, что правильно задал вопрос. Подробные объяснения в любых примерах помогут мне узнать это.

Спасибо за помощь.

P.S. 'nogo_class' используется на странице несколько раз, но текст «Продолжить больше» появляется на странице только один раз. ТАКЖЕ, я использую Perl v5.8.8, а Grabber требуется минимум 5.10.0.

1 Ответ

3 голосов
/ 18 октября 2011

Используйте HTML :: TokeParser :: Simple для анализа документа. Прекратите синтаксический анализ тегов a, когда найдете текст «Продолжить больше» в div.nogo.

#!/usr/bin/env perl

use warnings; use strict;
use HTML::TokeParser::Simple;
use URI;

my $p = HTML::TokeParser::Simple->new(handle => \*DATA);

my @interesting_links;

while (my $tag = $p->get_tag(qw'a div')) {
    if ($tag->is_start_tag('div')) {
        my $class = $tag->get_attr('class');
        if (defined($class) and $class eq 'nogo_class') {
            my $text = $p->get_text('/div');
            last if defined($text) and $text eq 'Proceed No More';
        }
    }
    elsif ($tag->is_start_tag('a')) {
        my $href = $tag->get_attr('href');
        next unless defined $href;
        my $uri = URI->new($href);
        my $host = $uri->host;
        next unless $host =~ /[.]com\z/;
        push @interesting_links, $href;
    }
}

print "$_\n" for @interesting_links;

__DATA__
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
</head>
<body>

<p><a href="http://example.com/link1">Link 1</a>, <a
href="http://example.org/link2">Link 2</a> and <a
href="http://example.com/link3">Link 3</a></p>

<div class="nogo_class">Keep going man!</div>

<p><a href="http://example.com/link4">Link 4</a>, <a
href="http://example.org/link5">Link 5</a> and <a
href="http://example.net/link6">Link
6</a></p>

<div class="nogo_class">Keep going man!</div>

<div class="nogo_class">Proceed No More</div>

<p><a href="#">Link 7</a>, <a href="#">Link 8</a> and <a href="#">Link
9</a></p>


</body>
</html>
...