Thread 3 Fragen: Trefferliste umstrukturieren, mit gefunden Links weiterarbeiten + wie kann ich nur Teile eines Treffers anzeigen? (47 answers)
Opened by vitopetre at 2010-04-11 23:27

murphy
 2010-04-13 02:15
#135909 #135909
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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?
[...]

Ein anderes Modul, über das man hier nachdenken könnte, wäre CPAN:XML::LibXML, was sowohl XML als auch HTML parsen und bequem per XPath zerlegen kann.

Kleines Beispiel:
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
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));
            }
        }
    }
}
When C++ is your hammer, every problem looks like your thumb.

View full thread 3 Fragen: Trefferliste umstrukturieren, mit gefunden Links weiterarbeiten + wie kann ich nur Teile eines Treffers anzeigen?