zoukankan      html  css  js  c++  java
  • [原]perl使用LWP模块写的翻译小程序 第2012位菜鸟 博客园

    [原]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
  • 相关阅读:
    (转)Python之路,Day6
    (转)函数作用域,匿名函数,函数式编程,面向过程,面向对象
    (转)面向对象编程初步
    day26-多态、封装、反射
    (转)面向对象进阶
    MySql-Mysql技术内幕~SQL编程学习笔记(1)
    Spring MVC-学习笔记(4)数据绑定流程
    Mybatis-学习笔记(10)调用存储过程、存储函数
    Mybatis-学习笔记(9)Mybatis3+spring4+springMVC
    Mybatis-学习笔记(8)常用的注解
  • 原文地址:https://www.cnblogs.com/lexus/p/2978567.html
Copyright © 2011-2022 走看看