3

私は使用しています

my $ua = new LWP::UserAgent;
$ua->agent("Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1 ");
my $url = "http://somedomain.com/page/";
my $req = new HTTP::Request 'GET' => $url;
$req->header('Accept' => 'text/html');
my $response = $ua->request($req);
my $html = $response->decoded_content;

ウェブページを取得します。このページでは、が表示されAbobo's Big Adventureます。$request->contentおよびでは$request->decoded_content、これは として示されていAbobo's Big Adventureます。

このデコードを正しく行うためにできることはありますか?

4

2 に答える 2

5

これは完全に有効な HTML です。HTML::Entitiesただし、 CPANを使用してエンティティをデコードできます。

use HTML::Entities;

...;
my $html = $response->decoded_content;
my $decoded_string = decode_entities($html);

HTTP::Response::decoded_contentHTML エンティティではなく、文字セットと文字セットが逆になっていることを示すドキュメントContent-encoding(これは HTML/XML 言語の機能であり、実際にはエンコーディングではありません)。

編集:

ただし、池上が指摘したように、エンティティをすぐにデコードすると、HTML が解析不能になる可能性があります。したがって、最初に HTML を解析し (たとえば、 を使用HTML::Tree)、必要な場合にのみテキスト ノードをデコードするのが最適な場合があります。

use HTML::TreeBuilder;

my $url = ...;
my $tree = HTML::TreeBuilder->new_from_url($url);    # invokes LWP automatically
my $decoded_text = decode_entities($tree->as_text);  # dumps the tree as flat text, then decodes.
于 2012-12-19T21:05:26.503 に答える
0

おそらくハッシュマークの前にアンパサンドがあると思います。HTMLエンティティを表現する'これらを変更するのはそれほど難しいことではありません。あなたはこのようなことをすることができます:

my $content =  $response->decoded_content;
$content    
    =~ s{(&#(\d{2,3});)}{
           $2 < 128 ? ord( $2 ) : $1
        }gem
    ;

範囲チェックは、ASCIIを扱っていることをほぼ保証します。より複雑にしたい場合は、値のハッシュをまとめて、次のように変更することもできます。

my %entity_lookup
    = ( 150 => '-'
      , 151 => '--' # m-dash
      , 160 => ' '
      ... 
    );
...
$content
    =~ s{(&#(\d+);)}{ 
           $2 < 128 ? ord( $2 ) : $entity_lookup{ $2 } // $1
        }gem
    ;

しかし、それはあなた次第です。

于 2012-12-19T20:54:30.420 に答える