• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[原]perl使用LWP模块写的翻译小程序 - 第2012位菜鸟 - 博客园

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

[原]perl使用LWP模块写的翻译小程序 - 第2012位菜鸟 - 博客园

[原]perl使用LWP模块写的翻译小程序

perl的LWP是抓取网页的经典模块,学习的过程中用这个模块写了一个小程序,是通过抓取有道翻译的翻译结果来实现的。废话不多说,先贴代码(解释见下文
复制代码

#! /usr/bin/perl
#学习perl LWP时用post做的翻译小脚本
#调用的是有道词典
use strict;
use warnings;
use LWP::UserAgent;
use JSON ;
#use Data::Dumper;

my $browser = LWP::UserAgent->new();
print "Please input the word:";
chomp (my $input = <STDIN>);
my $response = $browser->post(
#    \'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/\',
    \'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null\',
    [
        \'type\' => \'AUTO\',
        \'i\' => "$input",
        \'doctype\' => \'json\',
    ],
    );

if($response->is_success){
    my $result = $response->content;
    my $json = new JSON;
    my $obj = $json->decode($result);
    #print Dumper $obj;
    my $trans = @{$obj->{\'translateResult\'}[0]}[0]->{"tgt"};
    $trans = "翻译结果:$trans" if $trans;
    my $string;
    eval{
        $string  = join " ", @{$obj->{\'smartResult\'}->{"entries"}};
    };
    $trans = "$trans\n其他结果:$string" if $string;
    print $trans."\n" // "Not found\n";
}

复制代码
LWP实现表单POST提交

在chrome下打开有道翻译,然后在打开审查元素功能,试着输入hello,然后使用自动翻译,就可以捕获到下列的POST请求。

我们使用LWP::UserAgent模块来模仿浏览器实现的POST功能。LWP的经典教程可以在这里学习。

需要调用的函数为 $browser->post(url, pairs_arrayref),其中,pairs_arrayref为提交的参数,在这里我们根据Form Data里的信息就可以得出参数列表,我们这里的列表选择的是i代表提交的需翻译的单词,type是自动翻译,doctype 指的是返回的数据为json数据
复制代码

my $response = $browser->post(
#    \'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/\',
    \'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null\',
    [
        \'type\' => \'AUTO\',
        \'i\' => "$input",
        \'doctype\' => \'json\',
    ],
    );

复制代码

解析JSON

返回的JSON如下

{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":10,"translateResult":[[{"src":"你好","tgt":"How are you"}]],"smartResult":{"type":1,"entries":["","hello;hi"]}}

其中translateResult是翻译结果,smartResult是其它结果。

我们使用的是perl的JSON模块来对json数据进行解析(JSON模块的文档见这里)

my $result = $response->content;
my $json = new JSON;
my $obj = $json->decode($result);

使用decode将json数据转化成了perl的数据,返回的是对象的引用。

为了方便,我们可以将其用Dumper将对象打印出来看内部的结构(Data::Dumper的文档在这里)

print Dumper $obj

这是翻译“你好”的时候显示的结果(终端下中文有点乱码..):
复制代码

$VAR1 = {
          \'smartResult\' => {
                             \'entries\' => [
                                            \'\',
                                            "hello\x{ef}\x{bc}\x{9b}hi"
                                          ],
                             \'type\' => 1
                           },
          \'errorCode\' => 0,
          \'translateResult\' => [
                                 [
                                   {
                                     \'tgt\' => \'How are you\',
                                     \'src\' => "\x{e4}\x{bd}\x{a0}\x{e5}\x{a5}\x{bd}"
                                   }
                                 ]
                               ],
          \'type\' => \'ZH_CN2EN\',
          \'elapsedTime\' => 10
        };

复制代码

可以看出整个$obj是一个匿名哈希引用,而其中smartResult也是一个匿名哈希引用,translateResult则是一个匿名数组引用,然后一层层下去,最终键src的的值为翻译结果(关于perl的引用可以看我的另外一篇博文)于是,我们可以用下列方式提取翻译结果。

 my $trans = @{$obj->{\'translateResult\'}[0]}[0]->{"tgt"}; #最终翻译结果
@{$obj->{\'smartResult\'}->{"entries"}}; #其他智能翻译结果

最后运行截图:

分类: perl, 菜鳥日記
标签: perl, json, LWP

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap