Question

  

Possible en double:    Comment puis-je supprimer les liens externes de HTML en utilisant Perl?

D'accord, je travaille sur un travail pour un client en ce moment qui vient mis son choix de la langue à Perl. Je ne suis pas le meilleur en Perl, mais je l'ai fait des trucs comme ça avant avec elle mais il y a un certain temps.

Il y a beaucoup de liens comme ceci:

<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>

Je veux faire correspondre le chemin « / fr / sous-titres / 3586224 / mort devient-elle-en » et mettre ceux dans un tableau ou d'une liste (pas sûr de les mieux en Perl). J'ai cherché la documentation Perl, ainsi que regarder des tutoriels regex, et la plupart, sinon tout semblait orienté vers l'aide ~ = pour correspondre à des choses plutôt que les matches de capture.

Merci,

Cody

Était-ce utile?

La solution

Utilisez un analyseur HTML approprié pour analyser HTML. Voir cet exemple inclus HTML :: Parser

Ou, considérez l'exemple simple suivant:

#!/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>

Sortie:

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

Autres conseils

Ne pas utiliser les expressions rationnelles. Utilisez un analyseur HTML comme 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 comme celle dans votre exemple peut être associé à une expression régulière comme

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

Si le code HTML utilise des guillemets simples jamais (ou sans guillemets) autour d'une URL, ou s'il y a jamais citer les caractères dans l'URL, cela ne fonctionnera pas tout à fait raison. Pour cette raison, vous obtiendrez des réponses que vous dire de ne pas utiliser des expressions régulières pour analyser HTML. Tenez compte eux, mais continuer si vous êtes sûr que l'entrée sera bien comportés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top