Blog

成语列表

今天浏览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压缩格式

没有评论

Leave a Reply