Question

Je suis en train d'utiliser XPath pour extraire certaines balises HTML et des données et que je dois utiliser le module de XML::LibXML.

J'ai essayé de l'installer à partir de shell CPAN mais il ne l'installe pas.

J'ai suivi les instructions à partir du site CPAN sur l'installation, que nous devons installer des enveloppes libxml2, iconv et zlib avant d'installer XML::LibXML et il ne fonctionne pas.

En outre, s'il y a un autre module simple qui obtient ma tâche faite, s'il vous plaît laissez-moi savoir.

La tâche:

Je suis à la recherche d'une balise de <dd> spécifique sur une page html qui est vraiment grand (environ 5000-10000) balises <dd> et <dt>. Donc, je suis en train d'écrire un script qui correspond au contenu de balise <dd> et va chercher le contenu dans le correspondant (suivant) balise <dt>.

Je souhaite que je aurais-je été un peu plus clair. Toute aide est grandement appréciée.

Était-ce utile?

La solution

Si vous utilisez ActiveState Perl, vous devez ajouter les dépôts listés à ActivePerl 10xx paquets PPM Win32 à 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 adapté à 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'
          ]
        ];

Autres conseils

Si vous voulez juste des requêtes XPath je viens d'écrire hier un script qui utilise XML :: XPath :: XMLParser pour faire des requêtes XPath sur un fichier xml.

Je l'ai testé à la fois l'installation de Perl ActiveState et perl de fraises sur les fenêtres.

Je ne me souviens pas avoir à aller à CPAN pour installer des modules (bien que je l'ai déjà et j'ai oublié le faire :)), de sorte que vous pouvez peut-être 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";
}

En supposant que vous utilisez ActiveState Perl, vous pouvez obtenir XML :: LibXML fonctionne très bien. Vous pouvez obtenir XML :: LibXML de site Randy Kobes 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 libxml2, etc font partie de la fraise distribution de Perl, je crois.

Voir aussi mon message dans le fil Comment installer XML :: LibXML pour ActivePerl .

aborde certains problèmes / solutions que je rencontrais l'installation XML LibXML utilisant PPM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top