2010-05-11 3 views
1

는 펄을 사용하여 HTML에서 몇 가지 태그를 교체해야합니다Perl의 클래스를 기반으로 일부 HTML 태그를 대체하려면 어떻게해야합니까?

을 내가 가진이 :

<b>text</b><b>text</b><span id="b">text</span> 
: 나는 class=aspan 태그 대신 b 태그로 변경되는 경우이 필요

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

HTML::Manipulator을 사용해 보았지만 성공하지 못했습니다.

+2

글쎄, 어떤 HTML을 사용하는 방법에 대한 :: 매니퓰레이터 didn 히 일하지 않니? –

+0

HTML :: Manipulator :: replace는 클래스 속성 (ID 만 사용)을 사용하여 요소를 찾을 수 없으며 속성 만 변경 태그를 허용 할 수 없습니다. –

+0

파일을 읽고 계신가, 데이터를 정확히 얼마나 받고 있습니까? – ashurexm

답변

7

여기 HTML :: TreeBuilder을 사용하는 방법은

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

내가 너무 게으르다는 예를 제공해 주셔서 감사합니다. –

+0

감사합니다,이 코드는 매우 간단합니다 ... 그리고 아주 잘 작동합니다. –

-1

HTML::Tree을 사용하여 HTML을 구문 분석 한 다음 원하는 속성이있는 노드를 찾고 변경 한 다음 원하는대로 변경 한 새 트리를 출력하십시오.

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; 
+0

고마워, 난 수준이 낮은 사용자 ... 다른 쉬운 옵션이 있습니까? –

+1

낮은 수준의 사용자를 유지하려는 경우 분명 쉽고 간편한 단축키가있을 것입니다. 정규식을 사용하여 원하는 특정 변경을 수행하는 방법을 설명 할 수 있습니다. 정규 표현식을 사용하면 쉽게 적용 할 수 있기 때문입니다. 그러나 중첩 된 태그가 쉬운 방법을 혼란스럽게하지 않도록 프로그래밍 방식으로 HTML을 수정하는 일반적인 문제를 해결할 수있는 기회를 얻으시기 바랍니다. –

2

예는 HTML::Parser 사용 :

+0

고마워요 ... 아주 멋지 네요.하지만 더 명확하기 때문에 HTML :: TreeBuilder를 사용합니다. –

관련 문제