Невозможно установить модуль XML::LibXML в Windows.
-
20-09-2019 - |
Вопрос
Я пытаюсь использовать 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.