Non è possibile installare il modulo XML :: LibXML su Windows
-
20-09-2019 - |
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.
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.