Как извлечь теги URL и текст ссылки из HTML в Perl?

У меня есть страница, которая содержит это:

<a href="http://www.trial.com" title="yellow">Trial</a>
<a href="http://www.trial1.com" title="red">Trial2</a>

Как я могу получить якорный текст, URL и заголовок?

Я хочу получить этот вывод:

Trial, http://www.trial.com, yellow
Trial2, http://www.trial1.com, red

Я пытался использовать WWW::Mechanize, как объяснено и здесь, но я не знаю, как получить название таким образом. Есть ли у вас какие-либо идеи?

2 ответа

Решение

Простая версия, основанная на вашем вопросе

  • страница, которая выглядит как ваша (так что нет неясного HTML, который может испортить)
  • желаемый результат

Это может быть то, что вы ищете:

use strict;
use warnings;

use WWW::Mechanize;

my $mech = WWW::Mechanize->new;
$mech->get('file:page.html');

foreach my $link ($mech->links) {
    my $text  = $link->text;
    my $url   = $link->url;
    my $title = $link->attrs->{title};

    print "$text, $url, $title\n"
}

Удачного кодирования, TIMTOWTDI

Используя документацию, предоставленную в вашем вопросе. Я создал что-то, что решает твою проблему, я верю. Очевидно, что использование https://www.perlmonks.org/ имеет некоторые отличия, так как некоторые из URL-адресов не являются полными, но с некоторой простой проверкой и пропуском, если это не то, что вы хотите, я думаю, вы получите то, что вы хотите.

Пример вывода:

_____________________________________________________________________________________________________________________________
| Text                                            | URL                | Attributes
_____________________________________________________________________________________________________________________________
| Testing a metacpan dist with XS components      | ?node_id=1216149   | [name]post-head-id1216149[id]post-head-id1216149,  |
| Controlling the count in array                  | ?node_id=1216134   | [name]post-head-id1216134[id]post-head-id1216134,  |

Скорее всего, вы оказались в тупике. Вам просто нужно было создать цикл for, чтобы пройти через них, чтобы получить теги атрибутов и их значения.

Код:

#!/usr/bin/perl
# your code goes here
use strict;
use warnings;
use Data::Dumper;
use WWW::Mechanize ();
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

my @urls = (
    q{https://www.perlmonks.org/}
);

my $mech = WWW::Mechanize->new();
$mech->get(@urls);

my @links = $mech->links();
print qq{______________________________________________________________________________________________________________\n};
printf(qq{| %-65s | %-75s | %-25s\n},q{Text},q{URL},q{Attributes});
print qq{______________________________________________________________________________________________________________\n};
foreach my $link (@links) {
    if ($link->text() && $link->url()) {
        my $a;
        foreach my $attr (keys %{$link->attrs()}) {
            next if $attr =~ m/href/i;

            #$link->attr()->{$attr} is the value of the key in this hashref. 
            $a .= qq{[$attr]} . $link->attrs()->{$attr};
        }
        my $info;
        if ($a) {
            $info = sprintf(qq{| %-65s | %-75s | %-25s, },$link->text(),$link->url(),$a);
        } else {
            $info = sprintf(qq{| %-65s | %-75s |},$link->text(),$link->url());
        }
        print $info . qq{ |\n};
    }
}
Другие вопросы по тегам