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_content说明Content-encoding和 字符集是颠倒的,而不是 HTML 实体(这是一种 HTML/XML 语言功能,而不是真正的编码)。

编辑:

然而,正如 ikegami 指出的那样,立即解码实体可能会使 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 回答