http://www.perlmonks.org?node_id=694841

jackyliesam has asked for the wisdom of the Perl Monks concerning the following question:

How would one go about parsing and extracting "Epicor" out of:
<span class="classification_indent">Advertiser:</span>&nbsp; Epicor AS </div> </td>
I have tried different things and couldnt come up with a solution, thank you in advance for all your help.

Replies are listed 'Best First'.
Re: Parsing HTML
by pc88mxer (Vicar) on Jun 30, 2008 at 23:10 UTC
Re: Parsing HTML
by Popcorn Dave (Abbot) on Jun 30, 2008 at 23:30 UTC
    Take a look at HTML::TokeParser. I've used that successfully in the past, but I'm going on the assumption that you're going to want to pull other things out of the HTML source besides just that one item.


    Revolution. Today, 3 O'Clock. Meet behind the monkey bars.

    I would love to change the world, but they won't give me the source code

Re: Parsing HTML
by wfsp (Abbot) on Jul 01, 2008 at 06:50 UTC
    Here's my go using HTML::TokeParser::Simple. Rather a lot of it but I find it easy to write, debug and maintain. There's no need to try and cram everything into one loop, so I've used three. :-)

    Note that the output is utf8 because of the &nbsp;.

    #!/usr/local/bin/perl use strict; use warnings; use HTML::Entities; use HTML::TokeParser::Simple; my $p = HTML::TokeParser::Simple->new(*DATA); my $span_start; while (my $t = $p->get_token){ $span_start++, last if ( $t->is_start_tag(q{span}) and $t->get_attr(q{class}) and $t->get_attr(q{class}) eq q{classification_indent} ); } die qq{start span not found\n} unless $span_start; my $span_end; while (my $t = $p->get_token){ $span_end++, last if $t->is_end_tag(q{span}); } die qq{close span not found\n} unless $span_end; my ($div_end, $encoded); while (my $t = $p->get_token){ $div_end++, last if $t->is_end_tag(q{div}); $encoded .= $t->as_is if $t->is_text; } die qq{close div not found\n} unless $div_end; die qq{no text found\n} unless $encoded; my $decoded = decode_entities $encoded; # returns utf8 for ($decoded){ s/^\W+//; s/\W+$//; } printf qq{*%s*\n}, $decoded; __DATA__ <span class="classification_indent">Advertiser:</span>&nbsp; Epicor AS </div> </td>
    *Epicor AS*