成语列表

今天浏览TopLanguage的时候,看到有人提到成语接龙,于是想自己也试试。找到一个成语列表似乎是基本的一步,但从Google上找了一会,居然没有。看到问典上有个还比较全的成语列表,可惜是按照音调排在了不同的网页里,于是自己写了几个Perl脚本,把成语提取了出来。这几个脚本是相当quick & dirty的工作,不求功能完整,也没有整合起来,手工分成几步完成了全部工作。

  1. 获取这个页面的源代码,保存成本地文件,作为参数执行下面的代码。这个页面的HTML不知道是什么软件生成的,没有换行,全部都在一行上,于是就把其中的一个tag替换成了换行符。

    #!/usr/bin/env perl

    $_ = <>;

    s/</a>/\n/g;

    print;

  2. 把上个程序的输出导出到一个文件中,作为参数执行下面的代码。这一步就纯是提取每个音符开头的成语列表页面的链接,并加上链接头。当中有些链接是‘#top’,弄个if语句过滤掉。程序的输出就是一行行的链接了。

    #!/usr/bin/env perl

    while (<>) {

       if (/href='(.*)'/) {
    
           if ($1 eq '#top') {
    
           } else {
    
               print "http://www.wendian.com.cn/idiom/$1\n";
    
           }
    
       }
    

    }

  3. 把上个程序的输出导出到一个文件中,作为参数执行下面的代码,就会得到每行一个的成语列表了。这一步首先通过LWP包获得一个链接的HTML代码,然后转码,最后把包含成语列表的那一行找出来,提取初单个成语输出。运行时程序会在stderr提示宽字符之类的警告,可以忽略,用重定向符输出到文件时不影响。

    #!/usr/bin/env perl

    use utf8;

    use Encode;

    use LWP::Simple;

    while (<>) {

       $page = decode("gb2312", get($_));
    
       @lines = split(/\n/, $page);
    
       foreach $line (@lines) {
    
           if ($line =~ /首字拼音为/) {
    
               @words = split(/&lt;li style='font-size:15px;'>/, $line);
    
               foreach $word (@words) {
    
                   if ($word =~ /&lt;a href='.*'>(.*)<\/a>/) {
    
                       print "$1\n";
    
                   }
    
               }
    
           }
    
       }
    

    }

另外,为了方便,我把我的结果一并放上(文本文件用UTF-8编码)。(HTML格式|bzip压缩格式