【问题标题】:Perl web scraper, extract content from DIV that only has "style" tag?Perl网络爬虫,从只有“样式”标签的DIV中提取内容?
【发布时间】:2011-03-16 04:51:27
【问题描述】:

我被困在这个问题上并且已经一整天了..我对在 perl 中解析/抓取仍然很陌生,但我认为直到这个..我一直在尝试使用不同的 perl 模块(tokeparser , tokeparser:simple, web parser and some others)...我有以下字符串(实际上是整个HTML页面,但这只是显示相关部分..我正在尝试提取“text1”和“ text1_a”.. 等等(“text1”等只是作为示例放在那里)...所以基本上我认为我需要先从每个中提取:

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

然后解析它以获取 2 个值。我不知道为什么这给我带来了这么多麻烦,因为我认为我可以在 tokeparser:simple 中做到这一点,但我似乎无法返回里面的值的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:parser 模块,因为它基本上没有文档,所以我只是从模块中包含的示例和我在互联网上找到的示例拼凑而成。 . 任何建议都非常感谢。

【问题讨论】:

    标签: perl parsing web-scraping


    【解决方案1】:

    如果你想要一个 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;
    

    【讨论】:

    • 谢谢..是的,我只是有点困惑,什么解析器是正确的,因为那里有不同的解析器......我会调查一下,感谢您抽出宝贵的时间发布:)
    • HTML::TreeBuilder 是我唯一使用的。它可以非常好地处理糟糕的 HTML,并且使用起来更容易,开发速度也更快。但是,如果您的任务如此简单,则 Tokeparsing 会快得多——但速度可能并不重要。
    • 是的,速度无关紧要......我同意 tokeparser,我认为它不适合处理糟糕的 HTML,这就是为什么它给我带来了问题......感谢您在这方面的帮助,我现在要进进出出地学习treebuilder :)
    • 如果你切换到 HTML::TreeBuilder,看看 HTML::TreeBuilder::XPath (search.cpan.org/dist/HTML-TreeBuilder-XPath)
    • TokeParser 和 TreeBuilder 在后台使用相同的解析引擎——如果您的 TokeParser 代码在处理不良 HTML 方面表现不佳,那只是您的错。无论如何,TokeParser 的主要用途是当将整个 ​​DOM 保存在内存中的成本太高时——这种情况很少见。
    【解决方案2】:

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多