2009-08-26 4 views
1

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

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

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

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

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

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

Хотел бы я, чтобы я был немного более яснее. Любая помощь приветствуется.

+1

Нам нужно более подробно. Какая ошибка вы получаете от установки оболочки CPAN? –

+0

Можете ли вы показать нам, как вы пытаетесь установить его? –

+0

ActivePerl или Strawberry Perl? Какая версия? –

ответ

6

Если вы используете ActiveState Perl, вы должны добавить репозитории, перечисленные в ActivePerl 10xx Win32 PPM packages к 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

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

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

Я не помню, чтобы идти в 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"; 
} 
+1

Поскольку маловероятно, вы получите Win32 версии libxml2, iconv и zlib (хотя они существуют, см., Например, http://gnuwin32.sourceforge.net/packages.html) для работы с модулем XML :: LibXml, I думаю, что подход chollida звучит лучше. – ewall

+0

@ewall - укажите контекст. подход chollida лучше, чем что? – ysth

1

Если предположить, что вы используете ActiveState Perl, вы можете получить XML::LibXML работает просто отлично. Вы можете получить XML :: LibXML из Randy Kobes' site и вы получите LibXSLT/LibXML и т.д. от zlatkovic.com

Я просто установить LibXML первым, а затем использовать промилле установить XML :: LibXML. Работает отлично.

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

Смежные вопросы