Domanda

Sto cercando di utilizzare XPath per estrarre alcuni tag HTML e dati e per questo ho bisogno di usare il modulo XML::LibXML.

Ho provato a installare dalla shell CPAN ma non installa.

Ho seguito le istruzioni dal sito CPAN circa l'installazione, che abbiamo bisogno di installare libxml2, iconv e zlib involucri prima di installare XML::LibXML e non ha funzionato.

Inoltre, se c'è qualche altro modulo più semplice che ottiene il mio compito svolto, per favore fatemelo sapere.

Il compito a portata di mano:

Cerco un tag <dd> specifico in una pagina html che è davvero grande (circa 5.000-10.000) <dd> e <dt> tag. Così, sto scrivendo uno script che corrisponde al contenuto all'interno tag <dd> e recupera il contenuto all'interno del corrispondente (successivo) tag <dt>.

Io vorrei che ho potuto essere un po 'più chiaro. Ogni aiuto è molto apprezzato.

È stato utile?

Soluzione

Se si utilizza ActiveState Perl, è necessario aggiungere i repository elencati ActivePerl 10xx Win32 pacchetti PPM per ppm e quindi utilizzare

ppm install XML::LibXML

Cercando di analizzare HTML come XML non è generalmente un compito piacevole. Penso HTML :: TokeParser è più adatto al compito.

#!/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>

Output:

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

Altri suggerimenti

Se si desidera solo le query XPath poi ho appena scritto uno script ieri che utilizza XML :: :: XPath XMLParser di fare le query XPath su un file XML.

Ho testato sia con l'installazione di Perl di ActiveState e con Strawberry Perl su Windows.

Non mi ricordo di dover andare al CPAN di installare i moduli (anche se io possa avere in precedenza e si è dimenticato di farlo :)), quindi forse è possibile utilizzare il modulo XML :: XPath, invece?

Qui è il campione dalla documentazione

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";
}

Supponendo che si sta utilizzando ActiveState Perl, è possibile ottenere XML :: LibXML lavorando bene. È possibile ottenere XML :: LibXML da sito Randy Kobes' e si ottiene libxslt / libxml , ecc da zlatkovic.com

Ho appena installo libxml prima e poi usare ppm installare XML :: LibXML. Funziona bene.

Se si utilizza Strawberry Perl , CPAN dovrebbe funzionare per voi come libxml2, ecc fanno parte della fragola distribuzione di Perl credo.

Si veda anche il mio post nel thread Come si installa XML :: LibXML per ActivePerl? .

descrive alcuni problemi / soluzioni che ho incontrato l'installazione di XML-LibXML utilizzando PPM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top