Использование Perl для получения информации между тегами <div>на веб-странице - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь обработать серию веб-страниц, которые содержат необходимую мне информацию во вложенной серии тегов.К счастью, они пометили нужные мне теги полями id.У меня было несколько вопросов о стековом потоке, похожих на мои, но я не смог получить примеры, приведенные в них, для решения моей проблемы.Я использую HTML :: TokeParser :: Simple для моего примера кода, так как это то, что все остальные примеры используются на этом сайте.Вот пример кода:

#!/usr/bin/perl
use strict; use warnings;
use HTML::TokeParser::Simple;
my $p = HTML::TokeParser::Simple->new(handle => \*DATA);
while (my $tag = $p->get_tag('div')) {
   my $id = $tag->get_attr('id');
   next unless defined($id) and $id eq 'rank';

   my $rank = $p->get_text;
   print "Rank is:$rank.hhhh.jjjj.kkkk.llll\n";
}

__DATA__
<body class="png_bg" style="background: #0A0A0A none !important;">
<div >
<div class="left">
<h2>Bob Smith</h2>
</div>
<div id="ranks" class="right">
    <div id="rank"><strong>Rank:</strong> 1&nbsp;of&nbsp;51</div>

    <div id="div-rank"><strong>Overall Rank:</strong> 1&nbsp;of&nbsp;1918</div>
</div>
<div class="clear"></div>

Вывод программы:

=> ./test.pl 
Rank is:.hhhh.jjjj.kkkk.llll

В идеальном мире я пытаюсь получить текст, следующий за идентификаторами div:"rank" и "div-rank" в отдельных переменных.

По какой-то причине это единственная информация, хранящаяся внутри тегов на этих веб-страницах, все остальное хранится в таблицах, которые я смог получитьгораздо прощеОднако информация о ранжировании, содержащаяся в тегах, важна для моего проекта.

Что мне здесь не хватает?Почему здесь значение $ rank пусто?

Заранее спасибо!

1 Ответ

3 голосов
/ 03 апреля 2012

TokeParser слишком сложен. Декларативное программирование на победу!

my $html = <<'HTML';
    <div id="rank"><strong>Rank:</strong> 1&nbsp;of&nbsp;51</div>
    <div id="div-rank"><strong>Overall Rank:</strong> 1&nbsp;of&nbsp;1918</div>
HTML

use Web::Query qw();
my $w = Web::Query->new_from_html($html);
my $rank         = $w->find('#rank')->text;
my $overall_rank = $w->find('#div-rank')->text;

use HTML::TreeBuilder::XPath qw();
my $t = HTML::TreeBuilder::XPath->new;
$t->parse_content($html);
my $rank         = $t->findvalue('//*[@id="rank"]');
my $overall_rank = $t->findvalue('//*[@id="div-rank"]');
...