2014-08-22 1 views
2

Я пытаюсь разобрать следующую ссылку с помощью PerlНевозможно разобрать HTML-теги с Perl

http://www.inc.com/profile/fuhu

Я пытаюсь получить информацию, как Rank, 2013 Доход и 2010 доходов и т.д., Но когда выборка данные с perl, я получаю следующие и то же шоу в исходном коде страницы.

<dl class="RankTable"> 
<div class="dtddwrapper"> 
    <div class="dtdd"> 
    <dt>Rank</dt><dd><%=rank%></dd> 
    </div> 
</div> 
<div class="dtddwrapper"> 

И когда я проверяю Firebug, я следую за ним.

<dl class="RankTable"> 
<div class="dtddwrapper"> 
    <div class="dtdd"> 
    <dt>Rank</dt><dd>1</dd> 
    </div> 
</div> 
<div class="dtddwrapper"> 

Мой код Perl выглядит следующим образом.

use WWW::Mechanize; 

$url = "http://www.inc.com/profile/fuhu"; 
my $mech = WWW::Mechanize->new(); 

$mech->get($url); 

$data = $mech->content(); 
print $data; 
+1

Заканчивать http://search.cpan.org/~gaas/HTML-Parser/ или синтаксический анализатор XML – imran

+1

страница использует JavaScript шаблоны, так что я не подумайте, что Mechanize будет работать для вас. Вам лучше использовать свою страницу JSON для получения данных: http://www.inc.com/rest/inc5000company/22890/full_list. – gpojd

ответ

3

Как говорили другие, это не простой HTML, есть некоторое волшебство JS. Данные поступают из динамического запроса JSON.

Следующий сценарий печатает ранг и дает все остальное в $data. Сначала он получает идентификатор профиля, а затем делает соответствующий запрос JSON, как обычный браузер.

use strict; 
use warnings; 

use WWW::Mechanize; 
use JSON qw/decode_json/; 
use Data::Dumper; 

my $url = "http://www.inc.com/profile/fuhu"; 
my $mech = WWW::Mechanize->new(); 

$mech->get($url); 

if ($mech->content() =~ /profileID = (\d+)/) { 
    my $id = $1; 
    $mech->get("http://www.inc.com/rest/inc5000company/$id/full_list"); 
    my $data = decode_json($mech->content()); 
    my $rank = $data->{data}{rank}; 

    print "rank is $rank\n"; 
    print "\ndata hash value \n"; 
    print Dumper($data); 
} 

Выход:

rank is 1 

data hash value 
$VAR1 = { 
      'time' => '2014-08-22 11:40:00', 
      'data' => { 
         'ifi_industry' => 'Consumer Products & Services', 
         'app_revenues_lastyear' => '195640000', 
         'industry_rank' => '1', 
         'ifc_company' => 'Fuhu', 
         'current_industry_rank' => '1', 
         'app_employ_fouryearsago' => '49', 
         'ifc_founded' => '2008-00-00', 
         'rank' => '1', 
         'city_display_name' => 'Los Angeles', 
         'metro_rank' => '1', 
         'ifc_business_model' => 'The creator of an Android tablet for kids and an Adobe Air application that allows children to access the Internet in a parent-controlled environment.', 
         'next_id' => '25747', 
         'industry_id' => '4', 
         'metro_id' => '2', 
         'app_employ_lastyear' => '227', 
         'state_rank' => '1', 
         'ifc_filelocation' => 'fuhu', 
         'ifc_url' => 'http://www.fuhu.com', 
         'years' => [ 
            { 
            'ify_rank' => '1', 
            'ify_metro_rank' => '1', 
            'ify_industry_rank' => '1', 
            'ify_year' => '2014', 
            'ify_state_rank' => '1' 
            }, 
            { 
            'ify_industry_rank' => undef, 
            'ify_year' => '2013', 
            'ify_rank' => '1', 
            'ify_metro_rank' => undef, 
            'ify_state_rank' => undef 
            } 
           ], 
         'ifc_twitter_handle' => 'NabiTablet', 
         'id' => '22890', 
         'app_revenues_fouryearsago' => '123000', 
         'ifc_city' => 'El Segundo', 
         'ifc_state' => 'CA' 
        } 
     }; 
+0

Спасибо, я не знал о JSON в perl – Himanshu

1

Эта вещь: <% = ранг%> находится внутри сценария, это не HTML. Поэтому, когда вы видите это в firebug, оно отображается после выполнения этой части. Но когда вы смотрите на код HTML, вы видите это так. Поэтому разбор HTML не будет работать здесь.

Обычно в таких случаях переменные (например, ранг) передаются с сервера с использованием вызова XHR. Поэтому вам нужно проверить вызовы XHR в firebug и посмотреть ответы.

+0

Итак, как я могу получить данные? Я получил 5000 ссылок для разбора – Himanshu

+1

Возможно, вы хотите уточнить, что '<%=rank%>' является [шаблоном Underscore.js] (http://uderscorejs.org/#template) (я думаю) и что 'WWW :: Mechanize' [doesn 't поддержка JavaScript] (https://metacpan.org/pod/WWW::Mechanize::FAQ#JavaScript). – ThisSuitIsBlackNot

+1

Вам нужно выяснить это, где вы можете получить переменную (ранг). Вам нужно проверить запрос XHR (используя firebug). –