http://qs1969.pair.com?node_id=340509


in reply to HTML::Strip Problem

We use something like this:

use HTML::Parser 3; use LWP::Simple; my $html = get("http://perlmonks.org"); print body_text($html); sub body_text { my $content = $_[0] || return 'EMPTY BODY'; # HTML::Parser is broken on Javascript and styles # (well it leaves it in the text) so we 'fix' it.... my $p = HTML::Parser->new( start_h => [ sub{ $_[0]->{text}.=' '; $_[0]->{skip}++ if $_[1] + eq 'script' or $_[1] eq 'style'; } , 'self,tag' ], end_h => [ sub{ $_[0]->{skip}-- if $_[1] eq '/script' or $_[ +1] eq '/style'; } , 'self,tag' ], text_h => [ sub{ $_[0]->{text}.=$_[1] unless $_[0]->{skip}}, +'self,dtext' ] )->parse($content); $p->eof(); my $text = $p->{text}; # remove escapes $text =~ s/&nbsp;/ /gi; $text =~ s/&[^;]+;/ /g; # remove non ASCII printable chars, leaves punctuation stuff $text =~ s/[^\040-\177]+/ /g; # remove any < or > in case parser choked - rare but happens $text =~ s/[<>]/ /g; # crunch whitespace $text =~ s/\s{2,}/ /g; $text =~ s/^\s+//g; return $text; }

Hint. Using LWP::Simple to get web pages for a search engine is doomed to failure. You will for a start collect the frameset but not the frames of every page you visit that uses frames. You will be blocked by a number of sites for not being IE. You will ignore metarefreshes and 302 found (perhaps you want to perhaps not). You also have no idea of the problem if you don't get content.

cheers

tachyon

Replies are listed 'Best First'.
Re: Re: HTML::Strip Problem
by mkurtis (Scribe) on Mar 29, 2004 at 05:23 UTC
    thanks for the code tachyon. Thats not my crawler above there. I used LWP::Simple only to get html to see how well strip would parse it. Thanks for the tip though. My real crawler or something close, i might not have updated is in the code section.