前の記事の仕組みを使って、ちょっとお遊びで作りました(^^;)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!からトップのソースを取ってくるだけ)にして、動作するものを置いておきます。こちらからどぞ。

http://q.hatena.ne.jp/1204789749

この質問で「スクレイピング」ってはじめて知りました。
同様のことは他のツールを使ってやってましたけど、
JavaScriptだけでこんなことができるなんて、すごい(^^)

回答者さんのリンク先のプログラムを参考に、任意の
銘柄コードを入力すると、Yahoo!からデータを取ってくる
プログラムを作ってみました。

<?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>

<script language="javascript" type="text/javascript">
<!--
varhttpObj;
function httpRequest(target_url)
{
try
{
      if(window.XMLHttpRequest)
{
httpObj = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
httpObj = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
alert('エラーです');
return;
}
}
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;

//kanrenにgetTextの「関連情報」から始まるテキストを入れる
var kanren=getText.substring(getText.indexOf('関連情報',0));

//trtagにkanrenの「<tr」から始まるテキストを入れる
var trtag=kanren.substring(kanren.indexOf('<tr',0));

//trtagの5つ目の「<td」の位置を調べて
var found=-1;
for (var i=1;i<=5;i++){
found=trtag.indexOf('<td',found+1);
}

//trtagの5つ目の「<td」以降の文字列で「<b」で始まるところの3文字あとの文字列をstartkabukaに入れる
var startkabuka=trtag.substring(trtag.indexOf('<b',found)+3);

//startkabukaの「</b」で始まる前までの文字をkabukaに入れる
var kabuka=startkabuka.substring(0,startkabuka.indexOf('</b',0));

//kabukaをフォームに入れる
document.form1.getkabuka.value=kabuka;
       }
}
//-->
</script>
</head>

<body>
<form name="form1">
銘柄コード<input type="text" name="code" style="ime-mode:disabled">の
<input type="button" value="株価GET" onclick="httpRequest('http://quote.yahoo.co.jp/q?s='+document.form1.code.value+'&d=v1&k=c3&h=on&z=m')"><br>
株価<input type="text" name="getkabuka">円
</form>
</body>
</html>

取得した文字列から必要なところを抜き出すのは、きっと
もっと良い方法があるんでしょうけど、とりあえずベタな
文字列関数で。

こちらにおいておきます→
http://www.simple-sys.com/archive/jsstudy_4.html

と思ってサーバーに置いて実行しようとしたら、エラーが出ちゃいました(^^;)
多分、Same-Originポリシー
によるものかな?

ローカルにHTMLファイルを落とせば使えました。
あとブラウザーによって使えなかったりするのかな?
IE6なら動きました。
こちらによれば、
new ActiveXObject(“Microsoft.XMLHTTP”) はIEでしか使えないっぽいですね。

http://q.hatena.ne.jp/1204273508

とにかく簡単に。

<html>
<head>
<script>
function keisan(){

if (document.fm.tate.value=='50'){
//縦が「50」の場合
if (document.fm.yoko.value=='10'){
kekka=500;
} else
if (document.fm.yoko.value=='20'){
kekka=1000;
} else
if (document.fm.yoko.value=='30'){
kekka=1500;
}
}

if (document.fm.tate.value=='100'){
//縦が「100」の場合
if (document.fm.yoko.value=='10'){
kekka=1000;
} else
if (document.fm.yoko.value=='20'){
kekka=2000;
} else
if (document.fm.yoko.value=='30'){
kekka=3000;
}
}

if (document.fm.tate.value=='200'){
//縦が「200」の場合
if (document.fm.yoko.value=='10'){
kekka=2000;
} else
if (document.fm.yoko.value=='20'){
kekka=4000;
} else
if (document.fm.yoko.value=='30'){
kekka=6000;
}
}

//値段に kekka を入れる
document.fm.nedan.value=kekka;

}
</script>
</head>
<body onLoad="keisan()">
<form name="fm">
縦
<select name="tate" onChange="keisan()">
<option value="50">50
<option value="100">100
<option value="200">200
</select>×
横
<select name="yoko" onChange="keisan()">
<option value="10">10
<option value="20">20
<option value="30">30
</select><br>
値段は<input type="text" name="nedan">円
</form>
</body>
</html>

上のソースを
http://www.simple-sys.com/archive/jsstudy_3.html
に置いておきました。

http://q.hatena.ne.jp/1202199353
Checkの部分が大分長くなっちゃったけど。
(Q1が1もしくは2もしくは3の場合)でかつ、
(Q2が選択されてない または Q3が選択されてない)場合アラート

って感じで。

<html>
<head>
<SCRIPT Language="JavaScript">
<!--
function Check()
{
if ((document.test.Q01[0].checked==true || document.test.Q01[1].checked==true || document.test.Q01[2].checked==true) && (document.test.Q02[0].checked==false  && document.test.Q02[1].checked==false  && document.test.Q02[2].checked==false  && document.test.Q02[3].checked==false || document.test.Q03[0].checked==false  && document.test.Q03[1].checked==false  && document.test.Q03[2].checked==false  && document.test.Q03[3].checked==false && document.test.Q03[4].checked==false)) { alert("問1で「1~3」と回答した人は、問2と問3にもお答えください"); return false; }
}
// -->
</SCRIPT>
</head>
<body>
<form name="test" onsubmit="return Check();">
問1<br>
<input type="radio" name="Q01" value="1">1<br>
<input type="radio" name="Q01" value="2">2<br>
<input type="radio" name="Q01" value="3">3<br>
<input type="radio" name="Q01" value="4">4<br>
<br><br>
問1で「1~3」を選んだ方は、問2、問3もお答えください<br><br>
問2<br>
<input type="radio" name="Q02" value="1">1<br>
<input type="radio" name="Q02" value="2">2<br>
<input type="radio" name="Q02" value="3">3<br>
<input type="radio" name="Q02" value="4">4<br>
<br>
問3<br>
<input type="radio" name="Q03" value="1">1<br>
<input type="radio" name="Q03" value="2">2<br>
<input type="radio" name="Q03" value="3">3<br>
<input type="radio" name="Q03" value="4">4<br>
<input type="radio" name="Q03" value="5">5<br>
<br>
<input type="submit" value="submit">
</form>
</body>
</html>

上記のソースを設置したのが、こちら→http://www.simple-sys.com/archive/jsstudy_2.html

http://q.hatena.ne.jp/1202193955
ラジオボタンがチェックされてるかどうかをチェックするのに、
radioの名前の後ろに [ ] で数字を指定してできるんですね。
勉強になりました。

<html>
<head>
<SCRIPT Language="JavaScript">
<!--
function Check()
{
if (document.test.Q01[3].checked==true && document.test.Q02[0].checked==false  && document.test.Q02[1].checked==false  && document.test.Q02[2].checked==false  && document.test.Q02[3].checked==false) { alert("問1で「持っていない」と回答した人は、問2にもお答えください"); return false; }
}
// -->
</SCRIPT>
</head>
<body>
<form name="test" onsubmit="return Check();">
問1<br>
<input type="radio" name="Q01" value="1">1<br>
<input type="radio" name="Q01" value="2">2<br>
<input type="radio" name="Q01" value="3">3<br>
<input type="radio" name="Q01" value="4">持ってない<br>
<br><br>
問2<br>
<input type="radio" name="Q02" value="1">1<br>
<input type="radio" name="Q02" value="2">2<br>
<input type="radio" name="Q02" value="3">3<br>
<input type="radio" name="Q02" value="4">4<br>
<br>
<input type="submit" value="submit">
</form>
</body>
</html>

上記のソースを設置したのが、こちら→http://www.simple-sys.com/archive/jsstudy_1.html

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha