Changeset 2233

Show
Ignore:
Timestamp:
05/09/07 14:42:43
Author:
miyagawa
Message:

refactored get_value to the function. Callback takes HTML::Element, not ->as_HTML for speedups. Added tests

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Web-Scraper/trunk/Changes

    r2229 r2233  
    11Revision history for Perl extension Web::Scraper 
     2 
     30.03 
     4        - use 'TEXT' rather than 'content' to grab text from element 
     5          to be more compatible with scrapi 
    26 
    370.02  Tue May  8 20:03:37 PDT 2007 
  • Web-Scraper/trunk/lib/Web/Scraper.pm

    r2231 r2233  
    3232    sub { 
    3333        my $stuff = shift; 
     34        my($html, $tree); 
    3435 
    3536        if (blessed($stuff) && $stuff->isa('URI')) { 
     
    3839            my $res = $ua->get($stuff); 
    3940            if ($res->is_success) { 
    40                 $stuff = $res->decoded_content; 
     41                $html = $res->decoded_content; 
    4142            } else { 
    4243                croak "GET $stuff failed: ", $res->status_line; 
    4344            } 
     45        } elsif (blessed($stuff) && $stuff->isa('HTML::Element')) { 
     46            $tree = $stuff->clone; 
     47        } elsif (ref($stuff) && ref($stuff) eq 'SCALAR') { 
     48            $html = $$stuff; 
     49        } else { 
     50            $html = $stuff; 
    4451        } 
    4552 
    46         my $tree = HTML::TreeBuilder::XPath->new; 
    47         $tree->parse($stuff); 
     53        $tree ||= do { 
     54            my $t = HTML::TreeBuilder::XPath->new; 
     55            $t->parse($html); 
     56            $t; 
     57        }; 
    4858 
    4959        my $stash; 
    50  
    51         my $get_value = sub { 
    52             my($node, $val) = @_; 
    53  
    54             if (ref($val) && ref($val) eq 'CODE') { 
    55                 return $val->($node->as_HTML); 
    56             } elsif ($val =~ s!^@!!) { 
    57                 return $node->attr($val); 
    58             } elsif (lc($val) eq 'content' || lc($val) eq 'text') { 
    59                 return $node->as_text; 
    60             } else { 
    61                 Carp::cluck "WTF"; 
    62             } 
    63         }; 
    64  
    6560        no warnings 'redefine'; 
    6661        local *process = sub { 
     
    7267            while (my($key, $val) = splice(@attr, 0, 2)) { 
    7368                if ($key =~ s!\[\]$!!) { 
    74                     $stash->{$key} = [ map $get_value->($_, $val), @nodes ]; 
     69                    $stash->{$key} = [ map get_value($_, $val), @nodes ]; 
    7570                } else { 
    76                     $stash->{$key} = $get_value->($nodes[0], $val); 
     71                    $stash->{$key} = get_value($nodes[0], $val); 
    7772                } 
    7873            } 
     
    10196    }; 
    10297} 
     98 
     99sub get_value { 
     100    my($node, $val) = @_; 
     101 
     102    if (ref($val) && ref($val) eq 'CODE') { 
     103        return $val->($node); 
     104    } elsif ($val =~ s!^@!!) { 
     105        return $node->attr($val); 
     106    } elsif (lc($val) eq 'content' || lc($val) eq 'text') { 
     107        return $node->as_text; 
     108    } else { 
     109        Carp::cluck "WTF"; 
     110    } 
     111} 
     112 
    103113 
    104114sub process {