2009-08-26 8 views
1

J'essaie d'utiliser XPath pour extraire des balises HTML et des données et pour cela j'ai besoin d'utiliser le module XML::LibXML.Impossible d'installer le module XML :: LibXML sous Windows

J'ai essayé de l'installer à partir de la coque CPAN mais elle ne s'installe pas.

J'ai suivi les instructions à partir du site CPAN sur l'installation, que nous avons besoin d'installer libxml2, iconv et zlib emballages avant d'installer XML::LibXML et il n'a pas fonctionné.

De plus, s'il y a un autre module plus simple qui remplit ma tâche, faites le moi savoir.

La tâche:

Je suis à la recherche d'une balise <dd> spécifique sur une page html qui est vraiment grand (environ 5000-10000) <dd> et <dt> balises. Donc, j'écris un script qui correspond au contenu de la balise <dd> et récupère le contenu dans la balise correspondante (suivante) <dt>.

J'aimerais pouvoir être un peu plus clair. Toute aide est grandement appréciée.

+1

Nous avons besoin de plus de détails. Quelle est l'erreur que vous obtenez de l'installation du shell CPAN? –

+0

Pouvez-vous nous montrer comment vous essayez de l'installer? –

+0

ActivePerl ou Strawberry Perl? Quelle version? –

Répondre

6

Si vous utilisez ActiveState Perl, vous devez ajouter les dépôts listés à ActivePerl 10xx Win32 PPM packages-ppm puis utilisez

 
ppm install XML::LibXML 

Essayer d'analyser HTML comme XML est généralement pas une tâche agréable. Je pense que HTML::TokeParser est plus approprié à la tâche.

#!/usr/bin/perl 

use strict; 
use warnings; 

use HTML::TokeParser; 

my $p = HTML::TokeParser->new(\*DATA); 

my @definitions; 

while (my $dl_tag = $p->get_tag('dl')) { 
    while (my $dt_tag = $p->get_tag('dt')) { 
     my $term = $p->get_trimmed_text('/dt'); 
     my $dd_tag = $p->get_tag('dd'); 
     my $defn = $p->get_trimmed_text('/dd'); 
     push @definitions, [$term, $defn]; 
    } 
} 

use Data::Dumper; 
print Dumper \@definitions; 

__DATA__ 
<dl> 
<dt>One</dt> 
<dd>1</dd> 
<dt>Two</dt> 
<dd>2</dd> 
</dl> 

Sortie:

 
$VAR1 = [ 
      [ 
      'One', 
      '1' 
      ], 
      [ 
      'Two', 
      '2' 
      ] 
     ]; 
1

Si vous voulez juste des requêtes XPath alors j'ai juste écrit un script hier qui utilise XML :: XPath :: XMLParser pour faire des requêtes XPath sur un fichier xml.

Je l'ai testé avec l'installation Perl de Activestate et avec perl de fraise sur les fenêtres.

Je ne me souviens pas avoir dû aller à cpan pour installer des modules (bien que je puisse avoir plus tôt et j'ai oublié de le faire :)), alors peut-être que vous pouvez utiliser le module XML :: XPath à la place?

Voici l'exemple de la documentation

use XML::XPath; 
use XML::XPath::XMLParser; 

my $xp = XML::XPath->new(filename => 'test.xhtml'); 

my $nodeset = $xp->find('/html/body/p'); # find all paragraphs 

foreach my $node ($nodeset->get_nodelist) { 
    print "FOUND\n\n", 
     XML::XPath::XMLParser::as_string($node), 
     "\n\n"; 
} 
+1

Comme il est peu probable que vous obteniez les versions Win32 de libxml2, iconv, et zlib (bien qu'elles existent, voir http://gnuwin32.sourceforge.net/packages.html par exemple) pour travailler avec le module XML :: LibXml, je pense que l'approche de Chollida sonne mieux. – ewall

+0

@ewall - donne un peu de contexte. L'approche de Chollida est meilleure que quoi? – ysth

1

En supposant que vous utilisez ActiveState Perl, vous pouvez obtenir XML::LibXML fonctionne très bien. Vous pouvez obtenir XML :: LibXML de Randy Kobes' site et vous obtenez libxslt/libxml, etc de zlatkovic.com

Je viens d'installer libxml, puis utilisez ppm installer XML :: LibXML. Fonctionne très bien.

Si vous utilisez Strawberry Perl, CPAN devrait fonctionner pour vous car libxml2, etc font partie de la distribution Strawberry Perl je crois.

Questions connexes