use HTML::TokeParser::Simple 2.1; my $parser = HTML::TokeParser::Simple->new( $ugly_html ); while (my $token = $parser->get_token) { rewrite_body_tag($token) if $token->is_start_tag('body'); $token->rewrite_tag; print $token->as_is; } sub rewrite_body_tag { # what could be easier? my $token = shift; $token ->delete_attr('bgcolor') ->delete_attr('alink') ->set_attr('class','foobar'); }