2012-07-31 9 views
5

Ich schreibe ein grundlegendes Skript, das nur alle Links von einer Webseite extrahiert. Es ist in Perl geschrieben und verwendet die Module WWW :: Mechanize und HTML :: Treebuilder :: Xpath, die beide über CPAN installiert wurden.HTML Treebuilder XPath zum Extrahieren von Links

Ich weiß, dass es einfach mit WWW :: Mechanize gemacht werden kann, möchte aber lernen, es auch mit XPath zu tun.

Also wird das Skript die gesamte Webseite analysieren und das href-Attribut für jedes Anker-Tag prüfen, den Link extrahieren und auf die Konsole drucken/in eine Datei schreiben. Bitte beachten Sie, dass ich im folgenden Skript "use strict" nicht verwendet habe, da ich dies nur schreibe, um das Konzept der Verwendung von XPath zum Durchlaufen des HTML-Baums zu verdeutlichen und zu verstehen.

hier ist das Skript:

#! /usr/bin/perl 

use WWW::Mechanize; 
use HTML::TreeBuilder::XPath; 
use warnings; 

$url="https://example.com"; 

$mech=WWW::Mechanize->new(); 
$mech->get($url); 

$tree=HTML::TreeBuilder::XPath->new(); 

$tree->parse($mech->content); 

$nodes=$tree->findnodes(q{'//a'}); # line is modified later. 

foreach $node($nodes) 
{ 
    print $node->attr('href'); 
} 

Und es gibt einen Fehler:

Can't locate object method "attr" via package "XML::XPathEngine::Literal" at pagegetter.pl line 23. 

ich das Skript geändert haben, wie folgt:

$nodes=$tree->findnodes(q{'//a/@href'}); 

while($node=$nodes->shift) 
{ 
    print $node->attr('href'); 
} 

Fehler:

Can't locate object method "shift" via package "XML::XPathEngine::Literal" 

Ich bin mir nicht sicher, wie der Wert des href-Attributs gedruckt werden soll.

$ Knoten sollten die Liste aller href-Attribute enthalten? Ich glaube, es speichert nicht den Wert, sondern Hinweise darauf?

Ich habe versucht, Beispiele zu suchen und zu lesen, aber ich bin mir nicht sicher, wie ich das anstellen soll.

Danke.

+0

Sie sollten * immer * 'streng 'verwenden, egal wie trivial Ihr Programm ist. Es ist wohl wichtiger, dass Sie Warnungen verwenden, die Sie gewählt haben. – Borodin

Antwort

4

Es gibt ein paar Fehler. Reparaturen:

# list context 
my @nodes = $tree->findnodes(
    q{//a}  # just a string, not a string containings quotes 
); 

# iterate over array 
for my $node (@nodes) { 
+0

Sie sollten einen XPath von '// a [@href]' verwenden, um alle Ankerelemente mit einem Attribut 'href' zu finden. – Borodin

+0

Danke. Einverstanden, aber was genau drucken Sie in der For-Schleife? Und ja, ich möchte die Links extrahieren? –

+0

@NeonFlash: Der Rest Ihres Codes bleibt so wie er ist. Einfach 'print $ node-> attr ('href')," \ n "' – Borodin

Verwandte Themen