2010-07-15 48 views
4

我被困在这一点,一直都是一天..我仍然很新,解析/刮在Perl中,但我认为我把它放下,直到这..我一直在尝试这与不同的perl模块(tokeparser, tokeparser:简单的,网页解析器和其他一些)...我有以下字符串(实际上它实际上是一个完整的HTML页面,但这只是显示相关的部分..我试图提取“text1”和“text1_a ” ..等(以下简称‘text1’中,等的只是把在那里为例)......所以基本上我觉得我需要从每个第一提取此:Perl网页抓取工具,从DIV中提取内容只有“风格”标签?

"<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'; 

我只是盲目试图理解web:解析器模块,因为它基本上没有任何文档,所以我只是将它们包含在模块中的示例与我在互联网上找到的示例拼凑起来。 。 任何意见是极大的赞赏。

回答

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

谢谢..是啊我只是有点困惑,至于什么解析器是正确的使用,因为那里有不同的东西......我会研究,谢谢你花时间发布:) – Rick 2010-07-15 03:52:21

+2

HTML :: TreeBuilder是我唯一使用的。它非常好地处理坏HTML,并且使用起来更容易,更快速。然而,如果你的任务很简单,Tokeparsing速度会更快 - 但速度可能并不重要。 – 2010-07-15 04:00:42

+0

是啊,速度无所谓...我同意tokeparser,我认为它不好处理坏的HTML,这就是为什么它给了我这个问题..感谢您在这方面的帮助,我将学习treebuilder现在进出:) – Rick 2010-07-15 04:13:32

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' 
    } 
    ] 
}; 

希望这会有所帮助