2010-07-15 4 views
4

Я застрял в этом и был весь день .. Я все еще довольно новичок в разборе/выскабливании в perl, но я думал, что все это было до сих пор. Я пробовал это с помощью разных модулей perl (tokeparser, tokeparser: простой, веб-парсер и некоторые другие) ... У меня есть следующая строка (которая на самом деле представляет собой целую HTML-страницу, но это просто показывает соответствующую часть. Я пытаюсь извлечь «text1» и «text1_a ».. и так далее („text1“, и т.д. просто положить туда в качестве примера) ... так что в основном я думаю, что мне нужно, чтобы извлечь это первый из каждого:Perl web scraper, извлекать контент из DIV, который имеет только тег «style»?

"<span style="float: left;">test1</span>test1_a" 

Затем разобрать это получить 2 значения .. Я не знаю, почему это причиняет мне столько неприятностей, как я думал, что могу просто сделать это в tokeparser: простой, но я не мог бы вернуть значение внутри DIV, интересно, если его, потому что он содержит еще один набор тегов (значения тегов)

строка (представляет собой HTML веб-страницы)

<div id="dataID" style="font-size: 8.5pt; width: 250px; color: rgb(0, 51, 102); margin-right: 10px; float: right;"> 
<div style="width: 250px; text-align: right;"><span style="float: left;">test1</span>test1_a</div> 
<div style="width: 250px; text-align: right;"><span style="float: left;">test2</span>test2_a</div> 
<div style="width: 250px; text-align: right;"><span style="float: left;">test3</span>test3_a</div> 

моя попытка в PERL модуль веб-анализатора:

my $uri = URI->new($theurl); 

my $proxyscraper = scraper { 
process 'div[style=~"width: 250px; text-align: right;"]', 
'proxiesextracted[]' => scraper { 
process '.style', style => 'TEXT'; 
}; 
result 'proxiesextracted'; 

Я просто слепо пытаюсь понять веб-сайт: модуль парсера, поскольку на нем нет документации, поэтому я просто собрал это вместе из примеров, которые они включили в модуль, и тот, который я нашел в Интернете. . Любые советы высоко ценится.

ответ

5

Если вам нужен парсер DOM (проще использовать просмотр дерева, немного медленнее). Попробуйте HTML::TreeBuilder

HTML::Element человек страницы (модуль включен)

Note also that look_down considers "" (empty-string) and undef to be 

разные вещи, в значениях атрибутов. Так что это:

$h->look_down("alt", "") 

Что приводит нас к вашему ответу:

use HTML::TreeBuilder; 

# check html::treebuilder pod, there are a few ways to construct (file, fh, html string) 
my $tb = HTML::TreeBuilder->new_from_(constructor) 

$tb->look_down(_tag => 'div', style => '')->as_text; 
+0

Спасибо .. да, я просто растерялся относительно того, какой парсер правильно использовать, поскольку там есть разные ... Я буду смотреть на это, спасибо, что нашли время to post :) – Rick

+2

HTML :: TreeBuilder - единственный, который я использую. Он отлично справляется с плохим HTML и значительно проще в использовании и быстрее развивается. Tokeparsing, однако, намного быстрее, если ваша задача такая простая, но скорость, вероятно, не имеет значения. –

+0

Да, скорость не имеет значения ... Я согласен с tokeparser, я думаю, что это плохо для обработки плохого HTML, поэтому это давало мне проблемы на этом .. спасибо за вашу помощь в этом, я собираюсь изучить treebuilder in и out now :) – Rick

1

с помощью Web::Scraper, попробуйте:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper::Simple; 
use Web::Scraper; 

$Data::Dumper::Indent = 1; 

my $html = '<div id="dataID" style="font-size: 8.5pt; width: 250px; color: rgb(0, 51, 102); margin-right$ 
<div style="width: 250px; text-align: right;"><span style="float: left;">test1</span>test1_a</div> 
<div style="width: 250px; text-align: right;"><span style="float: left;">test2</span>test2_a</div> 
<div style="width: 250px; text-align: right;"><span style="float: left;">test3</span>test3_a</div>'; 


my $proxyscraper = scraper { 
    process '//div[@id="dataID"]/div', 'proxiesextracted[]' => scraper { 
     process '//span', 'data1' => 'TEXT'; 
     process '//text()', 'data2' => 'TEXT'; 
    } 
}; 

my $results = $proxyscraper->scrape($html); 

print Dumper($results); 

Это даст:

$results = { 
    'proxiesextracted' => [ 
    { 
     'data2' => 'test1_a', 
     'data1' => 'test1' 
    }, 
    { 
     'data2' => 'test2_a', 
     'data1' => 'test2' 
    }, 
    { 
     'data2' => 'test3_a', 
     'data1' => 'test3' 
    } 
    ] 
}; 

Надеюсь, что это поможет

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

  • Нет связанных вопросов^_^