Não é possível instalar o módulo XML :: libxml no Windows
-
20-09-2019 - |
Pergunta
Estou tentando usar XPath
Para extrair algumas tags e dados html e para isso eu preciso usar XML::LibXML
módulo.
Tentei instalá -lo no CPAN Shell, mas ele não é instalado.
Eu segui as instruções do site da CPAN sobre a instalação, que precisamos instalar libxml2
, iconv
e zlib
Wrappers antes de instalar XML::LibXML
E não deu certo.
Além disso, se houver algum outro módulo mais simples que faça minha tarefa, entre em contato.
A tarefa em mãos:
Estou procurando por um específico <dd>
Tag em uma página HTML que é realmente grande (cerca de 5000 - 10000) <dd>
e <dt>
Tag. Então, estou escrevendo um script que corresponda ao conteúdo dentro <dd>
Tag e busque o conteúdo dentro do correspondente (a seguir) <dt>
marcação.
Eu gostaria de poder ter sido um pouco mais claro. Qualquer ajuda é muito apreciada.
Solução
Se você estiver usando o Activestate Perl, adicione os repositórios listados em ActivePerl 10xx Win32 ppm pacotes para ppm
e depois use
ppm install XML::LibXML
Tentar analisar o HTML como XML geralmente não é uma tarefa agradável. Eu penso Html :: Tokeparser é mais adequado para a tarefa.
#!/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>
Resultado:
$VAR1 = [ [ 'One', '1' ], [ 'Two', '2' ] ];
Outras dicas
Se você deseja apenas consultas XPath, acabei de escrever um script ontem que usa o XML :: XPath :: XMLParser para fazer consultas XPath em um arquivo XML.
Eu o testei com a instalação Perl da Activestate e com o Strawberry Perl no Windows.
Não me lembro de ter que ir ao CPAN para instalar algum módulo (embora eu possa ter anteriormente e esquecido de fazê -lo :)), então talvez você possa usar o módulo XML :: XPath?
Aqui está a amostra da documentação
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";
}
Supondo que você esteja usando o Activestate Perl, você pode obter Xml :: libxml trabalhando bem. Você pode obter xml :: libxml de Site de Randy Kobes e você obtém libxslt/libxml, etc. zlatkovic.com
Acabei de instalar o LIBXML primeiro e depois uso o PPM para instalar o XML :: libxml. Funciona muito bem.
Se você está usando Perl de morango, A CPAN deve funcionar para você como libxml2, etc, faz parte da distribuição de morango perl, acredito.
Veja também meu post no tópico Como instalo XML :: libxml para ActivePerl?.
Discute algumas questões/soluções que encontrei instalando o XML-LIBXML usando o PPM.