Как я могу заменить некоторые HTML-теги на основе их класса в Perl? - PullRequest
1 голос
/ 11 мая 2010

Мне нужно заменить некоторые теги в HTML, используя Perl:

У меня есть это:

<span class="a">text</span><span class="a">text</span><span id="b">text</span>

Мне это нужно, где теги span с class=a заменены на теги b:

<b>text</b><b>text</b><span id="b">text</span>

Я пытался использовать HTML :: Manipulator , но безуспешно.

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Вот как использовать HTML :: TreeBuilder:

use strict;
use warnings;
use HTML::TreeBuilder;

my $html_string = '<span class="a">text</span><span class="a">text</span><span id="b">text</span>';    

my $root = HTML::TreeBuilder->new_from_content($html_string);
$root->elementify;  # Make $root into an HTML::Element object;


for my $e ( $root->look_down( _tag => 'span', class => 'a' ) ) {
    $e->tag( 'b' );
    $e->attr( class => undef );
} 

print $root->as_HTML;
2 голосов
/ 12 мая 2010

Пример использования HTML :: Parser :

#! /usr/bin/perl

use warnings;
use strict;
use HTML::Parser;
my $p = HTML::Parser->new( api_version => 3,
  start_h => [\&start, "tagname, attr, text, skipped_text"],
  end_h   => [\&end,   "tagname,       text, skipped_text"],
);
$p->parse_file(\*DATA);

my @switch_span_end;
sub start {
  my($tag,$attr,$text,$skipped) = @_;
  print $skipped;
  unless ($tag eq 'span' && ($attr->{class}||"") eq "a") {
    print $text;
    return;
  }
  push @switch_span_end => 1;
  print "<b>";
}

sub end {
  my($tag,$text,$skipped) = @_;
  print $skipped;
  if (@switch_span_end && $tag eq "span") {
    print "</b>";
    pop @switch_span_end;
  }
  else {
    print $text;
  }
}
__DATA__
<span class="a">text</span><span class="a">text</span><span id="b">text</span>

Выход:

<b>text</b><b>text</b><span id="b">text</span>
0 голосов
/ 11 мая 2010

Я бы использовал HTML::Tree, чтобы проанализировать HTML, затем найти узлы, которые имеют нужные свойства, изменить их, а затем вывести новое дерево, в котором будут изменения, которые вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...