Вопрос

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

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

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

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

Задача:

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

Мне хотелось бы выразиться немного яснее.Любая помощь очень ценится.

Это было полезно?

Решение

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

ppm install XML::LibXML

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

#!/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'
          ]
        ];

Другие советы

Если вам просто нужны запросы 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";
}

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top