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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top