webForum webForum sponsras med lina och serverplats av Binero AB

Gå tillbaka   webForum > Utveckling > Webbutveckling > Perl, Python, Ruby och övrig CGI

Perl, Python, Ruby och övrig CGI Programspråket Perl och interfacet CGI, webbens veteraner.

Svar
 
Trådverktyg Visningsalternativ
Äldre 2004-05-20, 00:33   #1
Myten
Medlem
 
Registrerad: 2003-10-07
Ort: Eksjö
Inlägg: 13
Lösningar: 0
Hämta information från svt.

Jag pillar med ett script som hämtar info från http://www.svt.se/texttv/650.html (dvs, "just nu på tv") med LWP::Simple.

Jag får ner sidan och allt, men nu vill jag få ut vissa värden.
Så om någon vänlig regexpare skulle vilja ta tag i följande textsnutt vore det helfett:

<FONT COLOR="#6f6f6f"> 00.45-01.15</FONT><FONT COLOR="#007f00"> 24 Nöje </FONT><FONT COLOR="#6f6f6f"> 24 </FONT>

Det är 00.45-01.15, 24 Nöje och 24 jag vill åt (just i detta exemplet givetvis.)

Jag testade själv med följande regexp, men det vill inte fungera:
<FONT COLOR="#6f6f6f">\s+\d+</FONT><FONT COLOR="#007f00">\s+(.+)\s+</FONT><FONT COLOR="6f6f6f">\s+(.+)\s*</FONT>
__________________
There are 10 people in the world, those who understand binary and those who dont
Myten besöker inte forumet just nu   Svara med citat
Äldre 2004-05-20, 10:20   #2
Joakim
Medlem
 
Joakims avatar
 
Registrerad: 1999-12-24
Ort: Borås
Inlägg: 86
Lösningar: 0
Kod:
<.*> (\d\d\.\d\d-\d\d\.\d\d)<.*><.*> (.*) <.*><.*> (.*) <.*>
Borde nog fungera? Går säkert att göra både bättre och snyggare men jag är så seg så det får duga =)

Tänk på att det är lagbrott att publicera deras tablå på en hemsida, enstaka program faller dock under klassificeringen citat.

När man pillar med regexp är följande program guld värt:
http://weitz.de/regex-coach/
Där skriver du in strängen du skall matcha mot och ditt regexp så kan du direkt se hur det hela funkar och vad som matchas. Klockrent.
Joakim besöker inte forumet just nu   Svara med citat
Äldre 2004-05-20, 12:25   #3
Myten
Medlem
 
Registrerad: 2003-10-07
Ort: Eksjö
Inlägg: 13
Lösningar: 0
Jag ska testa det, tackar!

Jag skall inte publicera det på någon hemsida, jag ska bara använda det vid min terminal
__________________
There are 10 people in the world, those who understand binary and those who dont
Myten besöker inte forumet just nu   Svara med citat
Äldre 2004-05-20, 21:36   #4
Myten
Medlem
 
Registrerad: 2003-10-07
Ort: Eksjö
Inlägg: 13
Lösningar: 0
Det fungerade bra, förutom när vissa rader innehåller länkar till typ beskrivningar av programmen.

T.ex. <FONT COLOR="#6f6f6f"> 22.00-23.55</FONT><FONT COLOR="#007f00"> Gilbert Grape</FONT><FONT COLOR="#8f8f15"> <a href=637.html>637</a> </FONT><FONT COLOR="#6f6f6f"> SVT2 </FONT>
__________________
There are 10 people in the world, those who understand binary and those who dont
Myten besöker inte forumet just nu   Svara med citat
Äldre 2004-05-25, 14:43   #5
Hansen
Medlem
 
Registrerad: 2000-08-27
Ort: Malmö
Inlägg: 383
Lösningar: 53
Jag hade tacklat problemet på ett annat sätt:

Kod:
#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;

my $agent    = LWP::UserAgent->new;
my $response = $agent->get('http://www.svt.se/texttv/650.html');

unless ( $response->is_success ) {
    die( $response->status_line );
}

my $html    = $response->content;
my $fonts   = [];
my $entries = [];
my $begin   = 0;

while ( $html =~ m{<font color="(#6f6f6f|#007f00)">(.*?)</font>}igs ) {

    my ( $color, $text ) = ( $1, $2 );

    $text =~ s/^\s+//;
    $text =~ s/\s+$//;
    
    if ( $begin ) {
    
       if ( $text =~ m/Kommande program/ ) {
          last;
       }
       
       push @$fonts, { color => $color, text => $text };
    }
    else {
    
       if ( $text =~ m/P.g.ende program/ ) {
          $begin = 1;
       }
       
       next;
    }
}

for ( my $i = 0 ; $i < scalar(@$fonts) ; $i += 3 ) {

    my $entry = {};

    $entry->{duration} = $fonts->[ $i     ]->{text};
    $entry->{show}     = $fonts->[ $i + 1 ]->{text};
    $entry->{channel}  = $fonts->[ $i + 2 ]->{text};

    if ( defined $fonts->[ $i + 3 ]
        and $fonts->[ $i + 3 ]->{color} eq '#007f00' )
    {
        $entry->{show} .= " " . $fonts->[ $i + 3 ]->{text};
        $i++;
    }

    push @$entries, $entry;
}

binmode( STDOUT, ':utf8' );

while ( my $entry = shift(@$entries) ) {
    printf( "%s %-30s %s\n", $entry->{duration},
                             $entry->{show},
                             $entry->{channel} );
}
output:
Kod:
mundus:~/dev/perl/svt chansen$ ./ontv 
14.30-16.00 Kvinna ombord                  SVT1
12.00-15.10 Riksdagen i dag                SVT2
12.15-15.15 Partiledardebatt i...          24
12.00-15.00 Twebbys smågodis               Barn
14.30-15.00 Galen i dig                    TV3
14.35-15.00 Glamour                        TV4
14.35-15.05 Ett hem i...                   Kanal 5
__________________
Hansen
ch at ngmedia dot com

Ge människan en fisk och du kommer att ge honom mat för dagen. Lär honom fiska och du kommer att ge honom mat för livet. -- Kinesiskt ordspråk
Hansen besöker inte forumet just nu   Svara med citat
Äldre 2004-05-26, 17:26   #6
Myten
Medlem
 
Registrerad: 2003-10-07
Ort: Eksjö
Inlägg: 13
Lösningar: 0
Jag förstår inte hur du har gjort, men du ska ha creds som fixade det

Jag ska ändock försöka klura ut en egen lösning. Just nu försöker jag lite med HTML::TokeParser.
__________________
There are 10 people in the world, those who understand binary and those who dont
Myten besöker inte forumet just nu   Svara med citat
Äldre 2004-06-10, 00:01   #7
Hansen
Medlem
 
Registrerad: 2000-08-27
Ort: Malmö
Inlägg: 383
Lösningar: 53
Citat:
Myten skrev:
Jag förstår inte hur du har gjort, men du ska ha creds som fixade det
Vad är det du inte förstår, om du kan precisera det lite så kan jag nog hjälpa dig

Citat:
Myten skrev:
Jag ska ändock försöka klura ut en egen lösning. Just nu försöker jag lite med HTML::TokeParser.
Perl Monks har en tutorial om HTML::TokeParser.

CPAN har många moduler för att göra livet lättare, en av mina favoriter för att "skrapa" html är XML::LibXML.

Med XML::LibXML kan du använda DOM och XPATH för att "skrapa" html koden, här är ett exempel som hämtar "På TV Just nu" från DagensTv.com.

Kod:
#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use Text::Wrap;
use XML::LibXML;

my ( $parser, $xpath, $entries );

my $agent    = LWP::UserAgent->new;
my $response = $agent->get('http://www.dagenstv.com/se/chart/?now=1');

unless ( $response->is_success ) {
    die( $response->status_line );
}

$parser = XML::LibXML->new();
$parser->recover(1);

my $doc  = $parser->parse_html_string( $response->content );
my $list = $doc->findnodes('//tr[ child::td[ contains( @class, "charttime") ] ]');

while ( my $node = $list->shift ) {

    my $entry = {};

    # Channel
    $entry->{channel} = $node->findvalue('td[1]/img/@alt');

    # Name
    $xpath = 'descendant::*[ contains( @class, "name") ]/text()';
    $entry->{name} = trim( $node->findvalue($xpath) );

    # Description
    $xpath = 'descendant::*[ contains( @class, "description") ]/text()';
    $entry->{description} = trim( $node->findvalue($xpath) );
    $entry->{description} = wrap( '', '', $entry->{description} );

    # Time begin
    $xpath = 'descendant::*[ contains( @class, "time") ]/text()';
    $entry->{time_begin} = trim( $node->findvalue($xpath) );

    # Time end
    $xpath = 'descendant::*[ contains( @class, "name") ]/following-sibling::text()';
    $entry->{time_end} = ( $node->findvalue($xpath) =~ m/(\d+:\d+)/ )[0];

    push @$entries, $entry;
}

sub trim {
    my $string = shift;
    $string =~ s|^\s+||;
    $string =~ s|\s$||;
    $string =~ s|\s+| |;
    return $string;
}

my @channels = ( 'SVT1', 'SVT2', 'TV3', 'TV4', 'TV4 Plus', 'Kanal 5', 'MTV' );

my %wanted = map { $_ => 1 } @channels;

my $format = <<'END';

%s-%s  %-46s %15s
---------------------------------------------------------------------------
%s

END

binmode( STDOUT, ':utf8' );

while ( my $entry = shift(@$entries) ) {

    unless ( $wanted{ $entry->{channel} } ) {
        next;
    }

    printf( $format, $entry->{time_begin}, 
                     $entry->{time_end}, 
                     $entry->{name},
                     $entry->{channel}, 
                     $entry->{description} );
}
__________________
Hansen
ch at ngmedia dot com

Ge människan en fisk och du kommer att ge honom mat för dagen. Lär honom fiska och du kommer att ge honom mat för livet. -- Kinesiskt ordspråk
Hansen besöker inte forumet just nu   Svara med citat
Äldre 2004-06-11, 20:56   #8
Myten
Medlem
 
Registrerad: 2003-10-07
Ort: Eksjö
Inlägg: 13
Lösningar: 0
Citat:
Vad är det du inte förstår, om du kan precisera det lite så kan jag nog hjälpa dig
Vi har helt enkelt olika sätt att lösa problem, dina funkar till skillnad från mina. Sen är jag ganska grön när det kommer till Perl iochförsig. Och vad jag har förstått så _ska_ det vara svårt att förstå andra Perl-script.

Citat:
Perl Monks har en tutorial om HTML::TokeParser.
Jag har varit där inne och läst, men jag har inte lyckats greppa tankegången. Om du har tid och lust kan du ju göra ett exempelprogram så att jag kanske förstår bättre.
__________________
There are 10 people in the world, those who understand binary and those who dont
Myten besöker inte forumet just nu   Svara med citat
Svar
webForum > Utveckling > Webbutveckling > Perl, Python, Ruby och övrig CGI

Trådverktyg
Visningsalternativ

Forumregler
Du får inte posta nya trådar
Du får inte posta svar
Du får inte bifoga filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är av
HTML-kod är av

Forumhopp


Alla tider är i GMT +1. Klockan är nu 16:38.


Powered by: vBulletin Version 3.8.6
Copyright © webForum