2012-05-19 2 views
1

내가하는 일은 정말 쉽지만 어쨌든 나는 몇 시간 동안 고심하고있다. 따라서 올바른 방향으로 나를 가리 키도록하십시오.Perke에서 TokeParser를 사용하여 자체 포함 된 태그에서 값 추출

<img src="random.jpg" class="someClass" id="someId" alt="test" /> 

을 현재이 코드와이 일치 할 수 없습니다 :

my $tp = HTML::TokeParser->new(\$rawHTML) || die "Cant't open: $!"; 
while (my $token = $tp->get_token){ 
    my $ttype = shift @{ $token }; 
    if($ttype eq "S"){ 
    my($tag, $attr, $attrseq, $rawtxt) = @{ $token }; 
    if ($tag eq "img"){ 
     if(($attr->{'class'} eq "someClass")&&($attr->{'id'}eq "someId")){ 
     my $alttext = $attr->{'alt'}; 
     print "AltText: $alttext"; 
     ... 
     } 
     }   
    } 
    } 
} 

TokeParser 그냥 자기가 타를 포함 무시하는 것 같다

나는 다음과 같습니다 일부 HTML있어 gs < ... /> 왜? 이 문제에 대한 해결책을 찾기 위해 열심히 수색했으며, TokeParser 나 다른 Perl 모듈과 함께 작동하게하는 데 도움이 될만한 것에 감사드립니다 ...

감사합니다!

답변

2

:

#!/usr/bin/env perl 

use strict; use warnings; 
use HTML::TokeParser; 
use YAML; 

my $html = q{<img src="random.jpg" class="someClass" id="someId" alt="test"/>}; 

my $parser = HTML::TokeParser->new(\$html); 

while (my $token = $parser->get_token) { 
    print Dump $token; 
} 

출력은 :

--- 
- S 
- img 
- /:/
    alt: test 
    class: someClass 
    id: someId 
    src: random.jpg 
- 
    - src 
    - class 
    - id 
    - alt 
    -/
- '<img src="random.jpg" class="someClass" id="someId" alt="test"/>'

BTW, HTML::TokeParser::Simple주는 너 더 나은 인터페이스 야.

+0

실제로, 그것은 아름답게 작동했습니다. PingLu가 img 태그 내의 대체 텍스트를 잡으려고하는 것처럼 보였습니다. 아마 그게 아니라 ... – Kenosis

+0

Hmh ... 그래, 작동하고있어,이 다른 코드를 복사해도된다. 내가 HTML 파일 전체를 넣었을 때 의상이 깨지는 것 같습니다. 덤프를 만든 후에는 TokeParser가 여는 태그와 닫는 태그를 여러 개 점프하고있는 것 같습니다. 그래도 여전히 태그에 액세스 할 수 없습니다 ... 매우 이상합니다. 하지만 지금 당장 지쳐서 Mojo :: DOM 또는 Treebuilder를 살펴 보겠습니다. 어쨌든 고마워! 나는 대답을 받아 들일 것이고, 그것과 함께 일해야한다. 나는 왜 그것이 나의 특정한 html을 위해 안되는지에 의해 비틀 거린다. .. 불행하게도 그것은 기밀 데이터를 포함하고 있기 때문에 원래 HTML 코드를 제공 할 수 없다. – PingLu

1

someClasssomeId으로 주어진 html 코드에 대체 텍스트 "test"을 캡쳐하고 싶습니다. 이 경우, 다음을 시도하십시오

use Modern::Perl; 
use Web::Query qw(); 

my $w = Web::Query->new_from_html(<<'HTML'); 
<img src="random.jpg" class="someClass" id="someId" alt="test" /> 
HTML 

my @altText = $w->find('img[class="someClass"][id="someId"]')->attr('alt'); 

say @altText; 

출력 : 그것은 아무것도 무시하지 않습니다

test 
+0

답변 주셔서 감사합니다. 다른 모든 방법이 TokeParser에 의존하고 태그가 두 번 이상 반복되기 때문에 Web :: Query를 사용하고 싶습니다. 따라서 토큰과 웹을 결합하면 : query-> find는 정말 엉망이됩니다. 그럼에도 불구하고 나는 그것을 내 마음 속에 간직 할 것이다. :) – PingLu