извлечение текста из HTML (Perl) - PullRequest
0 голосов
/ 06 июля 2010

Я делаю скрипт, который заходит на страницу и извлекает из нее информацию. Скрипт я делаю это на Perl.

Проблема: не как запустить скрипт, потому что при запуске он получает URL-адрес вот так, а это не то, что мне нужно

<a href="http://valeptr.com/scripts/runner.php?BA=6672&amp;hash=08c5c66839a468a11b7574e6ce02e0&amp;url=http%3A%2F%2Fdizzydollarsgpt.com%2Fmembers%2Fregister.php%3Fref%3Dthomasd24" target="_blank"><img alt="DizzyDollarsGPT" border="0" src="enter.php_files/runner.jpeg" /></a>

И я хочу получить это:

<a href="http://valeptr.com/scripts/runner.php?PA=33425" target="_ptc" onclick="javascript:reloadpage(11)"> <img src="1appsearch.php_files/runner_007.gif" alt="Xray-cash" border="0">

Весь код здесь:

#!/usr/bin/perl
#=======================================================================
#
# FILE: ValePTR.pl
#
# USAGE: ./ValePTR.pl user password
#
# DESCRIPTION:
#
# OPTIONS: ---
# REQUIREMENTS: libgetopt-declare-perl
# BUGS: ---
# NOTAS: ---
# AUTOR: Alejandro
# VERSION: 1.0
# CREATED: Lunes 5 de julio del 2010
# REVISION: 1
#=======================================================================

use warnings;
use strict;
use HTML::TreeBuilder;
use WWW::Mechanize;
use Getopt::Long;
my($content, $search_result, @search_results);

    #Constructor del explorador con un UserAgent falso.
    my $Explorador = WWW::Mechanize->new( agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624' );
    $Explorador->get("file://home/alejandro/enter.php.html"); #Se procede a acceder a la dirección url para hacer el HTTP Post
    #$Explorador->field('username','miuser'); # Busca el campo username y pone el usuario
    #$Explorador->field('password','mipass'); # Busca el campo password y pone la contraseña
    #$Explorador->submit(); # Hace el HTTP POST

        #print $Explorador->content();
#parse $content with treebuilder
my $page = HTML::TreeBuilder->new();
$page->parse($Explorador->content());
$page->eof();


@search_results= $page->look_down(
sub{ $_[0]-> tag() eq 'a' and ($_[0]->attr('href'))}
);

foreach $search_result (@search_results){
my($url, $title, $summary);

$title = $page->look_down(
sub{ $_[0]-> tag() eq 'a' and ($_[0]->attr('href'))}
);
if($title)
{
print 'title: '.$title->as_HTML,"\n";
}
}


$page->delete;

Весь HTML-код здесь: http://gist.github.com/465568

PD: Пожалуйста, помогите мне, я был здесь как 3 часа без успеха

Определенно, что происходит, так это чтобы взять все, что есть один

http://valeptr.com/scripts/runner.php?BA=

и я хочу взять:

http://valeptr.com/scripts/runner.php?PA=

Ответы [ 2 ]

1 голос
/ 07 июля 2010

Я был бы склонен использовать HTML :: TokeParser :: Simple для этого, чтобы избежать накладных расходов при построении дерева документов:

#!/usr/bin/perl

use strict; use warnings;

use HTML::TokeParser::Simple;

my $parser = HTML::TokeParser::Simple->new('t.html');

while ( my $tag = $parser->get_tag('a') ) {
    my $href = $tag->get_attr('href');
    next unless $href =~ /runner\.php\?PA=[0-9]+\z/;

    print $tag->as_is;

    while ( my $token = $parser->get_token ) {
        print $token->as_is;
        last if $token->is_end_tag('/a');
    }
    print "\n";
}

Вывод:

<a href="http://valeptr.com/scripts/runner.php?PA=33425" target="_ptc" onclick="javascript:reloadpage(11)"> <img src="1appsearch.php_files/runner_007.gif" alt="Xray-cash" border="0"> </a> ... etc

1 голос
/ 06 июля 2010

Ваш звонок на look_down() не может различить ссылки, которые вы хотите, и ссылки, которые вы не делаете.Попробуйте более сильный фильтр, например

@search_results = $page->look_down(
    sub {$_[0]->{tag} eq 'a'  &&
         $_[0]->attr('href') =~ /\?PA=/}); # only match http://...?PA=...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...