0

このページからリンクを抽出するために HTML::SimpleLinkExtor を使用しています : http://cpc.cs.qub.ac.uk/authorIndex/AUTHOR_index.html文字としての「Ç」。何をするか %C7 に変更します。したがって、プログラムの残りの部分でリンクを使用すると、コード 404 エラーが発生します。これが私のコードです:

#!/usr/bin/perl

use strict;
use warnings;
use HTML::SimpleLinkExtor;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan"; #tests => 37; #
#use Test::Exception;


Test::More->builder->output ('result.txt');
Test::More->builder->failure_output ('errors.txt');

my $base = "http://cpc.cs.qub.ac.uk/authorIndex/AUTHOR_index.html";

my $sel = Test::WWW::Selenium->new( host        => "localhost", 
                                    port        =>  4444, 
                                    browser     => "*firefox", 
                                    browser_url => "http://cpc.cs.qub.ac.uk/" );


################################################
my  $extor = HTML::SimpleLinkExtor->new($base);
    $extor->parse_url($base);           
my  @all_links   = $extor->a;           
################################################


$sel->start();

            $sel->open_ok($base);

            $sel->open_ok($_) foreach (@all_links);

$sel->stop();

同様に、抽出されたリンクを使用して click() 関数を実装する方法はありますか?

ありがとう

4

1 に答える 1

5

その Web ページは latin1 エンコーディングで提供されるため、バイト 0xC7 として Ç をエンコードします。それにもかかわらず、HTML::SimpleLinkExtorはこれをリンク用に UTF-8 に変換するのに十分賢いはずです。これはほとんど標準であるためです。しかし、そうはしません。そのソースには次のように書かれています。

sub parse_url {
    my $data = $_[0]->ua->get( $_[1] )->content;
    return unless $data;
    $_[0]->parse( $data );
}

ここでの間違いは、エンコード変換を適切に行うために、 ->contentの代わりに->decoded_contentを使用する必要があることです。HTML::SimpleLinkExtor のバグ レポートを提出することをお勧めします。それまでの間、この壊れたメソッドを置き換える独自のメソッドを作成してみてください。

編集:これはうまくいくかもしれません(テストされていません):

# replace this:
$extor->parse_url($base);           

# with this:
my $data = $extor->ua->get($base)->decoded_content;
if (defined $data) {
    $extor->parse($data);
}
于 2013-07-25T14:01:53.233 に答える