我正在使用
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
。
我能做些什么才能正确解码?
答案 0 :(得分:5)
为什么,这是完全有效的HTML!但是,您可以使用CPAN中的HTML::Entities
解码实体。
use HTML::Entities;
...;
my $html = $response->decoded_content;
my $decoded_string = decode_entities($html);
HTTP::Response::decoded_content
的文档声明Content-encoding
和字符集是相反的,而不是HTML实体(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.
答案 1 :(得分: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
;
但那取决于你。