Domanda

  

Eventuali duplicati:
   Come posso rimuovere i collegamenti esterni da HTML utilizzando Perl?

Va bene, sto lavorando su un lavoro per un cliente in questo momento che ha appena acceso la sua scelta della lingua per Perl. Io non sono il migliore in Perl, ma ho fatto cose del genere prima con esso anche se qualche tempo fa.

Ci sono un sacco di link come questo:

<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" class="bnone">Death Becomes Her
        (1992)</a>

Voglio che corrisponda al percorso "/ it / sottotitoli / 3.586.224 / morte-diventa-suo-it" e mettere quelli in un array o una lista (non sono sicuro che quelli meglio in Perl). Ho cercato la documentazione Perl, così come guardando tutorial regex, e la maggior parte se non tutti sembrava orientato verso l'utilizzo di ~ = Tabellino cose piuttosto che le partite di cattura.

Grazie,

Cody

È stato utile?

Soluzione

Con una corretta parser HTML per analizzare HTML. Vedere questo esempio incluso con HTML :: Parser

In alternativa, si consideri il seguente esempio semplice:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TokeParser::Simple;

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

my @hrefs;

while ( my $anchor = $parser->get_tag('a') ) {
    if ( my $href = $anchor->get_attr('href') ) {
        push @hrefs, $href if $href =~ m!/en/subtitles/!;
    }
}

print "$_\n" for @hrefs;

__DATA__
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath 
Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" 
class="bnone">Death Becomes Her
                (1992)</a>

Output:

/en/subtitles/3586224/death-becomes-her-en

Altri suggerimenti

Non usare espressioni regolari. Utilizzare un parser HTML come HTML :: TreeBuilder .

my @links;
my $tree = HTML::TreeBuilder->new; # empty tree
$tree->parse_file($file_name);
$tree->elementify;

my @links = map { $_->attr('href') } $tree->look_down( _tag => 'a');

$tree = $tree->delete;

# Do stuff with links array

URL come quella nel tuo esempio può essere abbinato con un'espressione regolare come

($url) = /href=\"([^\"]+)\"/i

Se l'HTML utilizza sempre virgolette singole (o senza virgolette) attorno ad un URL, o se ci sono mai citare caratteri nell'URL, quindi questo non funziona perfettamente ragione. Per questo motivo, si otterrà alcune risposte che ti dice di non usare le espressioni regolari per analizzare HTML. li ascolto, ma portare avanti se si è sicuri che l'ingresso sarà ben comportata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top