2012-07-31 18 views
5

Estoy escribiendo un script básico que simplemente extrae todos los enlaces de una página web. Está escrito en Perl y hace uso de los módulos WWW :: Mechanize y HTML :: Treebuilder :: Xpath, que he instalado a través de CPAN.HTML Treebuilder XPath para extraer enlaces

Sé que se puede hacer fácilmente utilizando solo WWW :: Mechanize, pero también me gustaría aprender a hacerlo con XPath.

Por lo tanto, el script analizará toda la página web, y comprobará el atributo href para cada etiqueta de anclaje, extraerá el enlace, lo imprimirá en la consola/lo escribirá en un archivo. Tenga en cuenta que en el script a continuación, no he usado el uso estricto, ya que solo estoy escribiendo esto para aclarar y comprender el concepto de usar XPath para atravesar el árbol HTML.

aquí es el guión:

#! /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'); 
} 

y da un error:

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

He modificado la secuencia de comandos de la siguiente manera:

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

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

error:

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

No estoy seguro, cómo imprimir el valor del atributo href.

$ nodes debe contener la lista de todos los atributos de href? Creo que no almacena el valor, sino que apunta a él.

Intenté buscar y leer ejemplos, sin embargo, no estoy seguro de cómo hacerlo.

Gracias.

+0

Usted debe * siempre * 'usar strict', sin importar cuán trivial sea su programa. Podría decirse que es más importante que 'uses advertencias 'que hayas elegido usar. – Borodin

Respuesta

4

Hay un par de errores. Reparaciones:

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

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

Debe usar un XPath de '// a [@href]' para encontrar todos los elementos de anclaje con un atributo 'href' – Borodin

+0

Gracias. De acuerdo, pero ¿qué es exactamente lo que imprimes dentro de For Loop? Y sí, quiero extraer los enlaces? –

+0

@NeonFlash: El resto de su código permanece como está. Simplemente 'print $ node-> attr (' href '), "\ n" ' – Borodin

Cuestiones relacionadas