Schrift
[thread]12220[/thread]

html parsen

Leser: 10


<< >> 8 Einträge, 1 Seite
Froschpopo
 2008-07-22 10:01
#112424 #112424
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich suche eine Möglichkeit mit HTML::Parser den Inhalt von <div class="p">...</div> zu extrahieren.

Also quasi:
Code: (dl )
1
2
3
4
5
6
<div class="p">diesen Text brauche ich!</div>
<div class="p">diesen Text brauche ich!</div>
<div class="em">uninteressant</div>
<div class="p">diesen Text brauche ich!</div>
<div class="p">diesen Text brauche ich!</div>
<div class="em">uninteressant</div>


Wie kann ich HTML::Parser auf class="p" abrichten?
Ich hab auch schon ins Wiki geschaut, aber die Beispiele dort sind mir nicht wirklich schlüssig.

Hier mal ein Anfang:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

my @found = ();
my $p = HTML::Parser->new(
        start_h => [\&start, 'self,tagname,attr'],
        end_h   => [\&end, 'self,tagname'],
        text_h  => [\&text, 'self,dtext']
);

chdir("c:/users/frosch/documents/schulen/");

$p->parse_file("bw.html");


sub start {
        my ($self, $tagname, $attr) = @_;
        $self->{'div'} = 1 if $tagname eq 'div';
}

sub end {
        my ($self, $tagname) = @_;
}

sub text {
        my ($self, $dtext) = @_;
        $dtext =~ s/\n\r//;
        push @found, $dtext;
}

for (@found) {
        print $_,"\n";
}

print $#found," Ergebnisse.\n";

Wie sage ich dem Parser, dass er jetzt nur auf class="p"> reagieren soll?
renee
 2008-07-22 11:21
#112426 #112426
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

my @found = ();
my $p = HTML::Parser->new(
        start_h => [\&start, 'self,tagname,attr'],
        end_h   => [\&end, 'self,tagname'],
        text_h  => [\&text, 'self,dtext']
);

chdir("c:/users/frosch/documents/schulen/");

$p->parse_file("bw.html");


sub start {
        my ($self, $tagname, $attr) = @_;
        $self->{'div'} = 1 if $tagname eq 'div';
        $self->{parse_div} = 1 if $tagname eq 'div' and $attr->{class} eq 'p';
}

sub end {
        my ($self, $tagname) = @_;
        $self->{parse_div} = 0 if $tagname eq 'div';
}

sub text {
        my ($self, $dtext) = @_;
        $dtext =~ s/\n\r//;
        push @found, $dtext if $self->{parse_div};
}

for (@found) {
        print $_,"\n";
}

print $#found," Ergebnisse.\n";


Im Wiki stehen aber auch Beispiele wie man an Attribute kommt...

Wenn es nicht so sehr auf Geschwindigkeit ankommt, würde ich eher CPAN:Web::Scraper verwenden.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pktm
 2008-07-22 11:25
#112428 #112428
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich arbeite da immer mit HTML::TOkeParser, und habe dazu gerade ein schönes Modul entdeckt: http://search.cpan.org/~ovid/HTML-TokeParser-Simpl...

Da kannst du anfragen:
Code: (dl )
 if ( $token->is_start_tag( 'font' ) ) { ... }


und da drin:
Code: (dl )
$token->get_attr([$attribute])


verwenden. Siehe dazu den Abschnitt "Data Accessors"

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2008-07-22 11:54
#112432 #112432
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ganze mit CPAN:Web::Scraper:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use warnings;
use Web::Scraper;

my $scraper = scraper {
  process 'div[class="p"]' => 'divs[]' => 'TEXT';
  result 'divs';
};

my $content = do{ local (@ARGV,$/) = 'bw.html'; <> };
my $res = $scraper->scrape( $content );

use Data::Dumper;
print Dumper $res;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2008-07-22 20:42
#112449 #112449
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
renee+2008-07-22 09:21:59--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

my @found = ();
my $p = HTML::Parser->new(
        start_h => [\&start, 'self,tagname,attr'],
        end_h   => [\&end, 'self,tagname'],
        text_h  => [\&text, 'self,dtext']
);

chdir("c:/users/frosch/documents/schulen/");

$p->parse_file("bw.html");


sub start {
        my ($self, $tagname, $attr) = @_;
        $self->{'div'} = 1 if $tagname eq 'div';
        $self->{parse_div} = 1 if $tagname eq 'div' and $attr->{class} eq 'p';
}

sub end {
        my ($self, $tagname) = @_;
        $self->{parse_div} = 0 if $tagname eq 'div';
}

sub text {
        my ($self, $dtext) = @_;
        $dtext =~ s/\n\r//;
        push @found, $dtext if $self->{parse_div};
}

for (@found) {
        print $_,"\n";
}

print $#found," Ergebnisse.\n";


Im Wiki stehen aber auch Beispiele wie man an Attribute kommt...

Wenn es nicht so sehr auf Geschwindigkeit ankommt, würde ich eher CPAN:Web::Scraper verwenden.

hm, also irgendwie verursacht Zeile 22 einen "Use of uninitialized value in string eq..."
renee
 2008-07-22 20:49
#112450 #112450
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann musst Du halt noch auf die Existenz des Hasheintrags überprüfen. Du programmierst doch schon lang genug mit Perl um zu wissen wie man mit der Fehlermeldung umgeht.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2008-07-22 20:58
#112451 #112451
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
mhh ja stimmt eigentlich :D
mein Problem ist vermutlich eher, dass ich HTML::Parser nicht ganz verstehe.
Ich verstehe zum Beispiel nicht, wie dieser parse_div-Schlüssel zustande kommt!
renee
 2008-07-22 21:36
#112452 #112452
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Den kannst Du nennen wie Du willst. Das hat nichts mit HTML::Parser zu tun. Das ist ein "Flag", das ich setze um die div's zu markieren, die ich haben möchte.

Im start_handler wird einfach nur überprüft, ob das ein div ist, dessen Text im Array landen soll. Wenn ja, setze das Flag auf 1. Dann kommt der Parser zum Text. Dort wird dann überprüft, ob das Flag gesetzt ist. Wenn ja, dann füge den Text zum Array hinzu. Beim Tag schließen wird das Flag wieder zurück gesetzt (wenn es ein div ist), damit nicht von weiteren div's der Text geholt wird.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2008-07-22 10:01.