前の記事の仕組みを使って、ちょっとお遊びで作りました(^^;)Yahoo!のトップページのトピックスから見出しを取ってきて、適当につぎはぎにして表示するプログラムです。
まったく乱数で表示してるので、出てくる見出しはでたらめです。
取ったテキストを抜き出してなんやらかんやら加工をかけてます。
もっとスマートな方法があるとは思うんですが、、、今の自分では
この辺で限界(^^;)
JavaScriptで正規表現とか、配列の操作、タイマー、乱数とかほとんどはじめて使ってみました。今後こういったプログラムを書くときのために残しておきます。
やはりこれもローカルでないと動きません。
<?xml version="1.0">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script language="javascript">
<!--
varhttpObj;
function httpRequest(target_url)
{
try
{
httpObj = false;
if(window.XMLHttpRequest) {
// Firefox, Opera など
httpObj = new XMLHttpRequest();
} else if(window.ActiveXObject) {
// IE
try {
httpObj = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
httpObj = new ActiveXObject('Microsoft.XMLHTTP');
}
}
}
catch(e)
{
alert('エラーです');
return;
}
//データを取得する
httpObj.open("GET", target_url, true);
httpObj.onreadystatechange = DataRead;
httpObj.send("");
return;
}
function DataRead()
{
if (httpObj.readyState == 4 && httpObj.status == 200)
{
//取得したレスポンスをgetTextに入れる
var getText=httpObj.responseText;
//getText1にgetTextの「<ul class="emphasis">」から始まるテキストを入れる
var getText1=getText.substring(getText.indexOf('<ul class="emphasis">'));
//getText2にgetText1の「</ul>」の前までのテキストを入れる
var getText2=getText1.substring(0,getText1.indexOf('</ul>'));
//getText3の配列に、<a>~</a>を入れる
var getText3=getText2.match(/<a.+?>.+?</a>/g);
//すべてのgetText3の配列のタグを取り除く
for (var i=0;i<getText3.length;i++){
var xx=getText3[i].match(/<a.+?>(.+?)</a>/);
getText3[i]=RegExp.$1;
}
//すべてのgetText3の「、」を半角スペースに置き換え
for (var i=0;i<getText3.length;i++){
getText3[i]=getText3[i].replace('、',' ').replace('「',' ').replace('」',' ');
}
//すべてのgetText3の連続する半角スペースを1つにする
for (var i=0;i<getText3.length;i++){
while (getText3[i].indexOf(' ')!=-1){
getText3[i]=getText3[i].replace(' ',' ');
}
}
//すべてのgetText3の両端の半角スペースを削除する
for (var i=0;i<getText3.length;i++){
getText3[i]=getText3[i].replace(/^[ ]*/gim, "").replace(/[ ]*$/gim,"");
}
//半角スペースがあるものだけがつぎはぎの対象なので、それの要素番号をtaishouYousoにpushする
var taishouYouso=new Array();
for (var i=0;i<getText3.length;i++){
if (getText3[i].indexOf(' ')!=-1){
taishouYouso.push(i);
}
}
//もし要素が1つ以下の場合、作れないのでごめんなさい
if (taishouYouso.length<=1){
alert('今の見出しでは作れませんでした。。。ごめんなさい');
} else {
//異なる2つの要素を取得する
ret=" ";
for (var youso1=0;youso1<taishouYouso.length;youso1++){
do {
var youso2=Math.floor( Math.random() * taishouYouso.length );
} while (youso1==youso2)
//1つめの要素の前半部分と、2つめの要素の後半部分をくっつけて見出しを作る
var nukidashi1=getText3[taishouYouso[youso1]].substr(0,getText3[taishouYouso[youso1]].indexOf(' '));
var nukidashi2=getText3[taishouYouso[youso2]].substr(getText3[taishouYouso[youso2]].indexOf(' '));
ret=ret+nukidashi1+nukidashi2+' ';
}
setTimeout("scroll()",200);
}
}
}
function getTsugihagi(){
httpRequest('http://www.yahoo.co.jp/');
}
function scroll(){
ret=ret.substring(1,ret.length)+ret.substring(0,1);
document.fm.txt.value=ret;
setTimeout("scroll()",200);
}
//-->
</script>
</head>
<body onload="getTsugihagi()">
<form name="fm">
<input type="text" name="txt" size="30">
</form>
</body>
</html>
問い合わせ先をこのサーバー上のCGI(Yahoo!からトップのソースを取ってくるだけ)にして、動作するものを置いておきます。こちらからどぞ。