Leser: 27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl -w use strict; use warnings; use diagnostics; use WWW::Mechanize; my $mech = WWW::Mechanize->new(); my $url = 'http://www.perl-community.de/bat/poard/latest/24h'; $mech->get($url); my $c = $mech->content(); print length ($c) . " Byte geladen\n"; my @links = $mech->links(); foreach my $link (grep {defined $_->url() && defined $_->text()} @links) { print "Url: " . $link->url() . "\n"; print "Beschreibung: " . $link->text() . "\n"; }
1
2
3
4
5
6
7
8
9
10
11
18270 Byte geladen
Url: /bat/userprefs/set_theme#quickset
Beschreibung: Font
Url: http://wiki.perl-community.de/Wissensbasis/AllgemeinesWieFrageIchbeiPerlCommunity
Beschreibung: Wiki:Wie frage ich?
Url: /bat/content/view/home
Beschreibung: Startseite
Url: /bat/poard/start
Beschreibung: Forum
Url: /bat/blog/start
Beschreibung: Blog
2010-04-02T09:26:06 biancaIch hab Dir mal was gebaut, was auch gleich die Seite lädt und ohne den Parser auskommt.
2010-04-06T11:56:33 pqinwiefern kommt das "ohne den parser" aus? intern wird in WWW::Mechanize auch ein parser verwendet. könntest du vielleicht das, was da intern gemacht wird, mal kurz hier mit eigenem code darstellen, ohne modul? gehört sich ja deiner meinung nach so und forderst du ja auch von anderen ein.
1
2
3
4
5
6
7
8
9
<a
href=
"king/03king.html"
>
An Approach to Open Access Author
<!-- keep this here! -->
Payment
</a>
2010-04-06T08:08:48 vitopetreViel Erfolg mit Friedls Buch "Reguläre Ausdrücke". Das ist viel Arbeit, sich da rein zu lesen, aber sinnvoll, wenn du Perl lernen willst/musst.Nochmal vielen Dank für diese Auskunft. Ich werde versuchen mich in dieses Buch einzuarbeiten. Ich hätte noch nicht mal gewusst, dass es sich bei dem was ich suche um "reguläre Ausdrücke" handelt.
2010-04-06T08:08:48 vitopetreTrotzdem muss ich jetzt nochmal dumm fragen: RegEx sind also reguläre Ausdrücke und damit wird die Art und Weise bezeichnet wie ich den Text aus der HTML-Seite holen will oder das was WWW::Mechanize macht?
2010-04-06T08:08:48 vitopetreNache welcher anderen Methode funktionieren denn Module wie der HTML-Parser, den man statt der RegEX nutzen soll?
2010-04-05T20:29:23 vitopetreWeil diese Module paraxisorientiert sind und so manche Falle (auch bei seltsamen HTML) umgehen.Was ist denn das Problem mit WWW:Mechanize oder warum ist die Nutzung von HTML-Parser, Web-Scraper, etc. so viel besser?
QuoteDas Problem das GwenDragon anspricht kann ich zumindest nicht nachvollziehen.
Meinst du dass die <keep this here>-Klammer das letzte Wort des Artikelnamens abschneiden würde? Aber passiert das den oft?
Ich kenn mich in HTML auch nicht viel besser aus als in Perl, aber gegen schlechten Code oder Rechtschreibfehler kann man halt nicht immer was machen... - wie umgehen denn die von dir genannten Parser dieses Problem Gwen?
Wo ist die Verbindung zu Regex?
$item=~ m/<a href>(.+)<\/a>/;
$item=~ m/<a href>([^<]+)<\/a>/;
2010-04-06T08:20:59 GwenDragon2010-04-05T20:29:23 vitopetreWeil diese Module paraxisorientiert sind und so manche Falle (auch bei seltsamen HTML) umgehen.Was ist denn das Problem mit WWW:Mechanize oder warum ist die Nutzung von HTML-Parser, Web-Scraper, etc. so viel besser?
2010-04-06T08:48:04 esskarDazu kommt auch noch, das HTML (anders zu XML) keine reguläre Sprache ist, wodurch sie sich recht schlecht durch einen regulären Ausdruck ausdrücken lässt.
2010-04-06T10:10:33 vitopetreBeim Studieren von RegEx mit Perl viel SPaß. Auch diese bieten genügend Fallen für Anfänger.Die nächsten Studen oder wohl eher Tage werde ich mich jetzt mal versuchen tiefer in die "regulären Ausdrücke" einzuarbeiten, das müsste zumindest für das Programm, dass ich schreiben will reichen. Wenn ich mal mehr Zeit habe kann ich ja dann versuchen, das gleiche Programm nochmal mit nem HTML-Parser zu bauen und mir dann den Unterschied selber klarzumachen.
QuoteViel Erfolg, Zeit und Gelassenheit beim Lesen. Esgal welches Tier-Perl-Buch du verwendest, es hilft ungemein beim Lernen.Danke nochmal - ich denke, dass ich jetzt wo ich weiß, mit was ich eigentlich arbeiten muss, selbst zurechtkommen sollte, denn es gibt ja nicht nur das Eulenbuch (das ich mir aber auf jeden Fall reinziehen werde, wenn ich auch wohl nicht das ganze Ding von vorne bis hinten durchlesen werde...), sondern auch einige andere Bücher und Threads im Netz zu diesem Thema.
QuoteGerade habe ich das für dich geändert. ;)P.S: Wäre das sinnvoll in den Titel dieses Threads nachträglich - Stichwörter wie "reguläre Ausdrücke" oder "Regex" einzufügen oder wäre das redundant?
2010-04-06T10:10:33 vitopetreAch ja und sorry Bianca, wegen der nachträglich reineditierten Frage in meiner Antwort. Ich dachte nicht, dass mir jemand so schnell antwortet, erst als ich mit dem editieren fertig war, hab ich gesehen, dass du schon längst geantwortet hattest.
1
2
3
4
5
<h4 style="float:left">Inhalt</h4>
<p> blablablabla
123123123123asdfasdf
43214321fdsafdsafdsa
</p>
1 2 3 4 5 6 7
use HTML::TokeParser; $p = HTML::TokeParser->new(shift||"index.html"); while (my $token = $p->get_tag("p")) { my $text = $p->get_trimmed_text("/p"); print "$text\n"; }
QuoteDie Mitglieder in diesem Forum sind echt extrem schnell!
1 2 3 4
use HTML::TreeBuilder::XPath; my $tree = HTML::TreeBuilder::XPath->new; $tree->parse_file( "h4.html"); my $h = $tree->findvalue('//h4[@style="float:left"]/following-sibling::p');
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder; my $html_data=<<'HTML'; <html> <head><title>test</title></head> <body> <h4 style="float:left">Inhalt</h4> <p>blablablabla 123123123123asdfasdf 43214321fdsafdsafdsa</p> </body> </html> HTML my $html = HTML::TreeBuilder->new(); $html->parse($html_data); # erst das passende "h4" suchen # und dann auf das nachfolgende "p" zugreifen my $h4 = $html->look_down( # wir suchen nach einem "TAG" # und der soll "h4" lauten _tag => 'h4', # führe die den code aus wenn die Bedingung stimmt: # Wenn 1 zurückgeliefert wird haben wir was wir wollen sub { # ist das Attribut "style" gesetzt? return 0 if(! $_[0]->attr('style')); # enthält der Inhalt von "style" "float:left"? return 0 if( $_[0]->attr('style')!~/float:left/); # ist ein Inhalt vorhanden? return 0 if(! $_[0]->as_text()); # ist das nachfolgende Element von Typ "p"? return 0 if( $_[0]->parent()->content()->[$_[0]->pindex()+1]->tag() ne 'p'); return 1; }); if($h4) { # etwas wurde gefunden # den Inhalt ausgeben print "H4 => ".$h4->as_text()."\n"; # das nächste Element bezogen auf "H4" # also # h4 # -> # übergeordentes element (hier body) # -> # Position von h4 +1 ==> p my $p=$h4->parent()->content()->[$h4->pindex()+1]; print "P => ".$p->as_text()."\n"; } print "#"x70,"\n"; # alternative Variante: # erst "p" suchen und dann auf "h4" schließen my $p = $html->look_down( # wir suchen nach einem "TAG" # und der soll "p" lauten _tag => 'p', # führe die den code aus wenn die Bedingung stimmt: # Es muß ein Inhalt vorhanden sein # und das vorherige elemnet muss vom typ "h4" sein sub { # ist überhaupt ein inhalt da? return 0 if(! $_[0]->as_text()); # wir wollen das erste <p> was gefunden wird, # dessen vorheriges element "h4" ist return 1 if( $_[0]->parent()->content()->[$_[0]->pindex()-1]->tag() eq 'h4' ); return 0 }); if($p) { print "P => ".$p->as_text()."\n"; # das vorherige Element bezogen auf "p" my $h4=$p->parent()->content()->[$p->pindex()-1]; print "H4 => ".$h4->as_text()."\n"; } $html->delete();