今天浏览TopLanguage的时候,看到有人提到成语接龙,于是想自己也试试。找到一个成语列表似乎是基本的一步,但从Google上找了一会,居然没有。看到问典上有个还比较全的成语列表,可惜是按照音调排在了不同的网页里,于是自己写了几个Perl脚本,把成语提取了出来。这几个脚本是相当quick & dirty的工作,不求功能完整,也没有整合起来,手工分成几步完成了全部工作。
-
获取这个页面的源代码,保存成本地文件,作为参数执行下面的代码。这个页面的HTML不知道是什么软件生成的,没有换行,全部都在一行上,于是就把其中的一个tag替换成了换行符。
#!/usr/bin/env perl $_ = <>; s/<\/a>/\n/g; print;
-
把上个程序的输出导出到一个文件中,作为参数执行下面的代码。这一步就纯是提取每个音符开头的成语列表页面的链接,并加上链接头。当中有些链接是‘#top’,弄个if语句过滤掉。程序的输出就是一行行的链接了。
#!/usr/bin/env perl while (<>) { if (/href='(.*)'/) { if ($1 eq '#top') { } else { print "http://www.wendian.com.cn/idiom/$1\n"; } } }
-
把上个程序的输出导出到一个文件中,作为参数执行下面的代码,就会得到每行一个的成语列表了。这一步首先通过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(/<li style='font-size:15px;'>/, $line); foreach $word (@words) { if ($word =~ /<a href='.*'>(.*)<\/a>/) { print "$1\n"; } } } } }