Perl web scraper, извлекать содержимое из DIV, которое имеет только тег «style»? - PullRequest
4 голосов
/ 15 июля 2010

Я застрял на этом и был весь день .. Я все еще довольно плохо разбираюсь в синтаксическом анализе / перескакивании в Perl, но я думал, что до этого у меня это было .. Я пробовал это с разными модулями Perl (tokeparser , tokeparser: simple, web parser и некоторые другие) ... У меня есть следующая строка (которая на самом деле представляет собой целую страницу HTML, но это просто показывает соответствующую часть .. Я пытаюсь извлечь "text1" и " text1_a ".. и т. д. (" text1 "и т. д. просто приведены в качестве примера) ... так что в основном я думаю, что мне нужно извлечь это сначала из каждого:

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

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

строка (представляет 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, так как на нем практически нет документации, поэтому я собрал это воедино из примеров, включенных в этот модуль, и одного, который я нашел в Интернете. Любой совет с благодарностью.

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

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

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

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;
1 голос
/ 15 июля 2010

с использованием 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'
    }
  ]
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...