Не удается установить модуль XML :: LibXML в Windows - PullRequest
1 голос
/ 26 августа 2009

Я пытаюсь использовать XPath для извлечения некоторых HTML-тегов и данных, и для этого мне нужно использовать XML::LibXML модуль.

Я пытался установить его из оболочки CPAN, но он не устанавливается.

Я следовал инструкциям с сайта CPAN об установке, что нам нужно установить оболочки libxml2, iconv и zlib перед установкой XML::LibXML, и это не сработало.

Кроме того, если есть какой-либо другой более простой модуль, который выполняет мою задачу, пожалуйста, дайте мне знать.

Задача под рукой:

Я ищу определенный тег <dd> на html-странице, который является действительно большим (около 5000 - 10000) тегами <dd> и <dt>. Итак, я пишу скрипт, который соответствует содержимому в теге <dd> и извлекает содержимое в соответствующем (следующем) теге <dt>.

Хотел бы я быть немного яснее. Любая помощь с благодарностью.

Ответы [ 4 ]

6 голосов
/ 27 августа 2009

Если вы используете ActiveState Perl, вам следует добавить репозитории, перечисленные в ActivePerl 10xx Win32 PPM пакетов в ppm, а затем использовать

ppm install XML::LibXML

Попытка разобрать HTML как XML, как правило, не очень приятная задача. Я думаю HTML :: TokeParser больше подходит для этой задачи.

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

Выход:

$VAR1 = [
          [
            'One',
            '1'
          ],
          [
            'Two',
            '2'
          ]
        ];
1 голос
/ 27 августа 2009

Предполагая, что вы используете ActiveState Perl, вы можете получить XML :: LibXML , работающий просто отлично. Вы можете получить XML :: LibXML с сайта Рэнди Кобса и получить libxslt / libxml и т. Д. С zlatkovic.com

Сначала я просто устанавливаю libxml, а затем использую ppm для установки XML :: LibXML. Работает просто отлично.

Если вы используете Strawberry Perl , CPAN должен работать для вас, поскольку libxml2 и т. Д. Являются частью дистрибутива Strawberry Perl, я считаю.

1 голос
/ 27 августа 2009

Если вам нужны запросы XPath, я вчера написал сценарий, который использует XML :: XPath :: XMLParser для выполнения запросов XPath к XML-файлу.

Я протестировал его как с установкой perl Activestate, так и с клубничным perl на windows.

Я не помню, чтобы мне приходилось заходить в cpan для установки каких-либо модулей (хотя я мог раньше и забыл это сделать :)), так что, возможно, вы можете вместо этого использовать модуль XML :: XPath?

Вот образец из документации

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";
}
0 голосов
/ 17 января 2012

Также смотрите мой пост в теме Как мне установить XML :: LibXML для ActivePerl? .

Обсуждаются некоторые проблемы / решения, с которыми я столкнулся при установке XML-LibXML с использованием PPM.

...