Leser: 22
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
use LWP::Simple; $seite=get("http://www.dlib.org/rss/dlib.rss"); $seite=~ s/&.+?;/_/g; #entfernt alle mit &-beginnenden HTML-Sonderzeichen und ersetzt diese durch einen Unterstrich ( _ ) $stelle=0; $anfang=index($seite,"</channel>",$stelle); #hier soll das Ausschneiden anfangen while ($anfang>=0) { $ende=index($seite,"</rdf:RDF>",$anfang); $item=substr($seite,$anfang,$ende-$anfang); my @article = ($item =~ m/<title>(.+)<\/title>/g); foreach my $x (@article) {print "TI:$x\n\n " }; my @link = ($item =~ m/<link>(.+)<\/link>/g); foreach my $x (@link) {print "LI:$x\n\n " }; my @description = ($item =~ m/<description>(.+) by/g); foreach my $x (@description) {print "PT:$x\n\n " }; $anfang=index($seite,"<item>",$anfang+1); #Schleife um das ganze für den ganzen Quelltext zu machen! }
1 2
my @description = ($item =~ m/<description>(.+) by/g); foreach my $x (@description) {print "PT:$x\n\n " };
1 2
my @description = ($item =~ m/<description>(.+) <\/description>/g); foreach my $x (@description) {print "PT:$x\n\n " };
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 LWP::Simple qw(get); use XML::Simple; #use Data::Dumper; my $xml_data=get("http://www.dlib.org/rss/dlib.rss"); my $xml_ref=XMLin($xml_data); #print Dumper($xml_ref); #Liste mit den gesuchten Einträgen my @items=(); for my $item (@{$xml_ref->{item}}) { my %values=(); $values{title}=$item->{title}; $values{link}=$item->{link}; $values{desc}=''; # Nicht immer ist "description" hesetzt, # darum ist es nötig Erst abzufragen ob das Elemement vorhanden ist # und dann den gewünschten Wert holen $values{desc}=$1 if($item->{description} and $item->{description}=~m/^(.+?)\s+by/); # Referenz auf "%values" an das Array anhängen; push(@items,\%values); } for my $item (@items) { print "Title = ".$item->{title}."\n"; print "Link = ".$item->{link}."\n"; print "Beschreibung = ".$item->{desc}."\n"; print '#'x80,"\n"; }
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
#!/usr/bin/perl use strict; use warnings; use LWP::Simple qw(get); use XML::RSS; #use Data::Dumper; my $xml_data=get("http://www.dlib.org/rss/dlib.rss"); my $rss = XML::RSS->new; $rss->parse($xml_data); #print Dumper($xml_ref); #Liste mit den gesuchten Einträgen my @items=(); for my $item (@{$rss->{item}}) { # nur wenn "description" gesetzt ist. if($item->{description}) { my %values=(); $values{title}=$item->{title}; $values{link}=$item->{link}; $values{desc}=''; $values{desc}=$1 if( and $item->{description}=~m/^(.+?)\s+by/); # Referenz auf "%values" an das Array anhängen; push(@items,\%values); } } for my $item (@items) { print "Title = ".$item->{title}."\n"; print "Link = ".$item->{link}."\n"; print "Beschreibung = ".$item->{desc}."\n"; print '#'x80,"\n"; }
$values{desc}=$1 if( $item->{description}=~m/^(.+?)\s+by/);
for my $item (@{$rss->{items}})
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
#!/usr/bin/perl use strict; use warnings; use LWP::Simple qw(get); use XML::RSS; use HTML::TreeBuilder; use Data::Dumper; my $xml_data=get("http://www.dlib.org/rss/dlib.rss"); my $rss = XML::RSS->new(); $rss->parse($xml_data); #print Dumper($rss); #Liste mit den gesuchten Einträgen my @items=(); for my $item (@{$rss->{items}}) { # nur wenn "description" gesetzt ist. if($item->{description}) { my %values=(); $values{title}=$item->{title}; $values{link}=$item->{link}; $values{desc}=''; $values{desc}=$1 if($item->{description}=~m/^(.+?)\s+by/); # welche Elemente werden noch gebraucht? $values{autor}=''; $values{datum}=''; my $html_data=get($item->{link}); my $html = HTML::TreeBuilder->new(); $html->parse($html_data); #... # Lese die Daten, die du haben willst # keine Ahnung wo du sie suchst und was du haben willst... #... $html->delete(); # Referenz auf "%values" an das Array anhängen; push(@items,\%values); } } for my $item (@items) { print Dumper($item); }
2010-04-12T19:45:41 vitopetre[...]
Ich glaube bei HTML versuche ich doch lieber mit Regex weiterzuarbeiten, [...] denn in den HTML-Dingern gibt es leider viel zu viele Tags, die alles nur komplizierter als einfacher machen.
[...]
2010-04-12T19:45:41 vitopetreIch glaube bei HTML versuche ich doch lieber mit Regex weiterzuarbeiten
QuoteWas ich dich fragen wollte: Jetzt dauert das Programm ganz schön lange, wahrscheinlich weil jetzt jede auf dem RSS-Feed verlinkte Seite geparst wird
Quotegeht das nicht irgendwie ohne soviel Rechenleistung zu ziehen?
2010-04-12T19:45:41 vitopetreDas funktioniert alles schon mal sehr gut, auch wenn das ganze jetzt sehr langsam ist.
2010-04-12T19:45:41 vitopetreIch glaube bei HTML versuche ich doch lieber mit Regex weiterzuarbeiten, damit kenne ich mich zwar auch nicht richtig aus, aber wenigsten kann ich mir da Schritt für Schritt meine gewünschten Zeilen wie in dem Ursprungsprogramm holen, denn in den HTML-Dingern gibt es leider viel zu viele Tags, die alles nur komplizierter als einfacher machen.
2010-04-12T19:45:41 vitopetrePerl nimmt sich schon was es braucht. Aber die Daten müssen erst mal vollständig geholt werden, bevor man sie verarbeiten kann, je nach Internetverbindung dauert das etwas.Oder muss ich meinem PC nur irgendwie sagen, dass er Perl mehr Arbeitsspeicher etc. zuweisen soll?
2010-04-12T23:26:13 vitopetreich hab die letzten Tage versucht mich in Regex einzuarbeiten und hab damit zumindest einigermaßen Fortschritte gemacht
2010-04-12T23:26:13 vitopetrejetzt sagt ihr mir ich darf das nicht benutzen und jetzt hab ich wieder keine Ahnung wie ich weiter machen soll.
2010-04-12T23:26:13 vitopetreDie CPAN-Seiten sind für einen Anfänger wie mich irgendwie zu kryptisch ich verstehe einfach nicht genau wie ich das umsetzten soll.
2010-04-12T23:26:13 vitopetreWie sage ich denn z. B. dem Treebuilder, dass ich z. B. aus diesem Stück HTML:
...
z. B. die Keywords oder die DOI ausschneiden will?
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
#!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder; my $html_data=<<'HTML'; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <meta name="DOI" content="10.1045/march2010-kucsma" /> <meta name="description" content="D-Lib Magazine" /> <meta name="keywords" content="D-Lib Magazine, Digital Libraries, Digital Library Research" /> <link rel="metadata" href="03kucsma.meta.xml" /> <link href="../../../style/style1.css" rel="stylesheet" type="text/css" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <title>Using Omeka to Build Digital Collections: The METRO Case Study</title> </head> <body></body> </html> HTML my $html = HTML::TreeBuilder->new(); $html->parse($html_data); my $doi; # wir suchen nach einem "TAG" und der soll "meta" lauten # wir gehen alle gefunden tags durch for my $meta ( $html->look_down( _tag => 'meta' ) ) { # ist das Attribut "name" gesetzt? next if(! $meta->attr('name')); # ist der inhalt von "name" "DOI"? next if( $meta->attr('name') ne 'DOI'); # ist das Attribut "content" gesetzt? next if(! $meta->attr('content')); # gefunden $doi=$meta; last; } if($doi) { # etwas wurde gefunden # Attribut "content" ausgeben print $doi->attr('content')."\n"; } $html->delete();
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
#!/usr/bin/perl use strict; use warnings; use HTML::TreeBuilder; my $html_data=<<'HTML'; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <meta name="DOI" content="10.1045/march2010-kucsma" /> <meta name="description" content="D-Lib Magazine" /> <meta name="keywords" content="D-Lib Magazine, Digital Libraries, Digital Library Research" /> <link rel="metadata" href="03kucsma.meta.xml" /> <link href="../../../style/style1.css" rel="stylesheet" type="text/css" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <title>Using Omeka to Build Digital Collections: The METRO Case Study</title> </head> <body></body> </html> HTML my $html = HTML::TreeBuilder->new(); $html->parse($html_data); my $doi = $html->look_down( # wir suchen nach einem "TAG" # und der soll "meta" lauten _tag => 'meta', # führe die den Code aus wenn der Tag "meta" ist: # Wenn 1 zurückgeliefert wird haben wir was wir wollen sub { # ist das Attribut "name" gesetzt? return 0 if(! $_[0]->attr('name')); # ist der inhalt von "name" "DOI"? return 0 if( $_[0]->attr('name') ne 'DOI'); # ist das Attribut "content" gesetzt? return 0 if(! $_[0]->attr('content')); # gefunden return 1; }); if($doi) { # etwas wurde gefunden # Attribut "content" ausgeben print $doi->attr('content')."\n"; } $html->delete();
2010-04-12T23:26:13 vitopetreWarum ist denn der Treebuilder besser als der einfache HTML-Parser oder andere Module wie der Web-Scraper oder Mechanize?
1 2 3 4 5 6 7
my $abstract; for my $h3 ( $html->look_down( _tag => 'h3')) { next if($h3->as_text ne 'Abstract'); $abstract = $h3->as_text; last; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<h3 class="blue">Abstract</h3>
<p class="blue">
The definition and purpose of crowdsourcing and its relevance to libraries is
discussed with particular reference to the
<a href="http://newspapers.nla.gov.au">Australian Newspapers</a>
service, <a href="http://familysearchindexing.org">FamilySearch</a>,
<a href="http://wikipedia.org">Wikipedia</a>,
<a href="http://www.pgdp.net">Distributed Proofreaders</a>,
<a href="http://www.galaxyzoo.org">Galaxy Zoo</a>
and <a href="http://mps-expenses.guardian.co.uk">The Guardian MP's Expenses Scandal</a>.
These services have harnessed thousands of digital volunteers who
transcribe, create, enhance and correct text, images and archives. Known
facts about crowdsourcing are presented and helpful tips and strategies for
libraries beginning to crowdsource are given. </p>
2010-04-12T23:26:13 vitopetreEntschuldigt bitte, wenn ich mich so doof anstelle, aber ich hab die letzten Tage versucht mich in Regex einzuarbeiten und hab damit zumindest einigermaßen Fortschritte gemacht, jetzt sagt ihr mir ich darf das nicht benutzen und jetzt hab ich wieder keine Ahnung wie ich weiter machen soll.
2010-04-13T11:28:46 vitopetre[...]
Trotzdem werde ich jetzt mal versuchen es nach der Art und Weise von togeg zu machen, da ich ja keine Antworten auf meine ursprünglichen Fragen bekommen habe
[...]
2010-04-13T12:57:38 vitopetreAber bitte schreibt mir jetzt kein Programm, dass das alles kann, denn das ganze ist Teil einer Hausarbeit für die Uni
Quotewer die Autoren sind (und dabei jeden einzeln aufzählen)
Quotewie der Artikel heißt
Quotewelche Art von Artikel es ist (Editorial, Report, Opinion, etc.)
Quotewelche DOI der Artikel hat
Quotewenn möglich das Abstract des Artikels ausspucken
Quotewie die Zeitschrift heißt
Quoteum welche Ausgabe der Zeitschrift es sich handelt
Quoteum welche Nummer der Zeitschrift es sich handelt
Quotein welchem Jahr diese Ausgabe erschienen ist
Quotewelcher Link zu dieser Ausgabe führt
Quotewelche ISSN diese Ausgabe hat
2010-04-12T23:26:13 vitopetreEntschuldigt bitte, wenn ich mich so doof anstelle, aber ich hab die letzten Tage versucht mich in Regex einzuarbeiten und hab damit zumindest einigermaßen Fortschritte gemacht, jetzt sagt ihr mir ich darf das nicht benutzen und jetzt hab ich wieder keine Ahnung wie ich weiter machen soll.
2010-04-13T11:37:05 vitopetreLieber pq,
2010-04-12T00:28:11 vitopetre[...]
Wie sage ich Perl also: Hol dir den neuesten Rss-Feed und ziehe da die Infos die das Programm von topeg holt, dann geh weiter auf die Links und hole dort wieder Infos und Links, gehe dann auf eine speziellen Link und hole dort wieder ein paar Infos?
Ausserdem weiß ich immer noch nicht, was ich mache, wenn diese Seiten dann HTML nicht XML sind. Dann muss ich doch wieder auf meine Methode zurückgreifen oder?
[...]
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
use 5.010; use strict; use warnings; use URI; use XML::LibXML; # Global data my $feed_url = URI->new('http://www.dlib.org/rss/dlib.rss'); my %namespaces = ( rss => 'http://purl.org/rss/1.0/', rdf => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' ); # XML/HTML parser setup my $parser = XML::LibXML->new(); $parser->recover_silently(1); # XPath setup my $xpath = XML::LibXML::XPathContext->new(); while (my ($prefix, $url) = each %namespaces) { $xpath->registerNs($prefix, $url); } # Load feed my $feed = $parser->parse_file("$feed_url") or die 'Could not load feed'; # Find all items foreach my $item ($xpath->findnodes('/rdf:RDF/rss:item', $feed)) { my ($title, $description) = map { $xpath->findvalue("./$_/text()", $item); } qw/rss:title rss:description/; if (defined($title) && defined($description)) { say '#' x 72; say "Title: $title"; say "Description: $description"; # Determine URL of page relative to feed my $page_url = URI->new_abs($xpath->findvalue('./rss:link/text()', $item), $feed_url); if (defined($page_url)) { say "Page: $page_url"; # Load page my $page = $parser->parse_html_file("$page_url") or die "Could not load page: $page_url"; # Find all links on the page foreach my $anchor ($xpath->findnodes('//a[@href]', $page)) { my $link = URI->new_abs($anchor->getAttribute('href'), $page_url); say "Link: $link" if (defined($link)); } } } }
1 2 3 4 5 6 7 8
use strict; use warnings; use Data::Dumper; use XML::RSS; my $rss = XML::RSS->new; $rss->parsefile("/tmp/rss.xml"); my $items = $rss->{items}; print Dumper $items;
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 LWP::Simple qw(get); use XML::RSS; #use Data::Dumper; my $xml_data=get("http://www.dlib.org/rss/dlib.rss"); my $rss = XML::RSS->new; $rss->parse($xml_data); #print Dumper($xml_ref); #Liste mit den gesuchten Einträgen my @items=(); for my $item (@{$rss->{item}}) { my %values=(); $values{title}=$item->{title}; $values{link}=$item->{link}; $values{desc}=''; # Nicht immer ist "description" hesetzt, # darum ist es nötig Erst abzufragen ob das Elemement vorhanden ist # und dann den gewünschten Wert holen $values{desc}=$1 if($item->{description} and $item->{description}=~m/^(.+?)\s+by/); # Referenz auf "%values" an das Array anhängen; push(@items,\%values); } for my $item (@items) { print "Title = ".$item->{title}."\n"; print "Link = ".$item->{link}."\n"; print "Beschreibung = ".$item->{desc}."\n"; print '#'x80,"\n"; }