HSP2.xで、HTMLファイル内のリンク先を列挙するサンプルコード(モジュール付き)
Hot Soup Processor 2.x系で使える、HTMLソース内の、URLを列挙するためのサンプルモジュールとサンプルコードです。
スクレイピングとかの目的で使えると思いますw
まずは、サンプルモジュールから。
仮に、モジュールのファイル名は「enumurl.hsp」としておきましょう。
次に、上記モジュールを使用した、サンプルコードを2点ほど。
まずは、単純にHTMLファイルを読み込んで、URLを列挙する例です。
もう1点は、ちょっとアプリケーションっぽくしたサンプルコードですw
スクレイピングとかの目的で使えると思いますw
まずは、サンプルモジュールから。
仮に、モジュールのファイル名は「enumurl.hsp」としておきましょう。
;■解説
; プログラムの始めに #include "enumurl.hsp" と記述すると、
; 以下の命令が使用出来るようになります。
;
;
; SetURL "string" - 絶対URL変換用のURLを設定
; EnumURL p1,p2 - HPデータ内のリンクを列挙
;
; ※以下は、モジュール側で使用する命令
; (プログラム側で使用する必要無し)
;
; _LowerCase p1 - アルファベットの大文字を小文字に変換
; _SetEnumMode p1 - 取得モードの設定
; _EnumURLEx p1,p2,p3 - HPデータ内のリンクを列挙
;
; ○SetURL
; SetURL "string" - 絶対URL変換用のURLを設定
; "string" : HPのURL
;
; URLを設定します。
; 取得したURLが相対URLの場合、
; このURLを連結して、絶対URLに変換します。
;
; 例えば、SetURL "http://meteoricstream.com/"と記述して、
; 取得した相対URLが"index.html"の場合は、
; "http://meteoricstream.com/index.html"という絶対URLに変換されます。
;
; ○EnumURL
; EnumURL p1,p2 - HPデータ内のリンクを列挙
; p1=変数 : 結果を格納する文字列変数
; p2=変数 : HTMLファイルのデータを格納した文字列変数
;
; p2で指定した文字列変数からURLを列挙し、結果をp1に返します。
; 対象となるURLは、以下の通りです。
;
; http:// 〜
; ftp:// 〜
; mailto: 〜
; href= 〜
; src= 〜
;
; なお、以下の場合は、正常に読み込む事が出来ません。
;
; ●URLの最初が「#」
; (ターゲット名と区別する為、意図的に読まないようにしている)
;
; ●URLの先端、終端以外の部分に「'」が含まれている
;
; ●URLに半角スペースが含まれている
; (ただし、href=""、src=""で囲まれている場合は読める。)
;
;
;■簡単な使用方法
;
; まず、SetURLで相対URL->絶対URL変換時に使用するURLを設定します。
; 特に必要が無い場合、若しくは、絶対URLに変換しない場合はSetURL ""と記述してください。
; また、以下の項目に注意する必要があります。
;
; ●ファイル名(index.html,main.html等)を含まないURLを指定する。
; (http://meteoricstream.com/index.htmlなどはNG。)
;
; ●転送URLでない事を確認する。
;
; ●終端に必ず「/」を付ける。
;
; 例) SetURL "http://meteoricstream.com/"
;
;
; 次に、EnumURLを実行して、実際にURLを取得します。
;
; 例) EnumURL value,data
;
;
#module
#deffunc _LowerCase val
mref string,24
strlen lclen,string
repeat lclen
if lcFLG==0{
peek pe,string,cnt
if pe>=129&&(pe<=159):lcFLG==1;2バイト文字判定
if pe>='A'&&(pe<='Z'):poke string,cnt,pe+32
}
else{
lcFLG=0
}
loop
return
#deffunc _SetEnumMode str
mref mode,32
_LowerCase mode
return
#deffunc _EnumURLEx val,val,int
mref value,24
mref _dat,25
mref delmodeflg,2
;初期化
index=0 : ins=0
strlen len,_dat
sdim dat,len+1 : dat=_dat
_LowerCase dat ;小文字変換
dat+" "
strlen modelen,mode
;区切りコードの設定
masklen=6
dim mask,masklen
mask=''','"','\n',' ','<','>'
repeat
await ;一応。(^^;
instr ins,dat,mode,index
if ins==-1 : break
;URLの取得
sdim get,$3e8 : strlen len,dat : flg=0
repeat len-(ins+index),ins+index
peek p,dat,cnt
wpeek p.1,dat,cnt
repeat masklen
if(p==mask.cnt)||(p.1==mask.cnt){
getstr get,_dat,ins+index+modelen,mask.cnt
if delmodeflg==0 : get=mode+get
flg=1 : break
}
loop
if flg : break
loop
;"'",";"の削除
_c=""
strmid _c,get,0,1 : if _c=="'" : peek get,get,1
strlen _l,get
repeat 2,1
strmid _c,get,_l-cnt,1
if _c=="'" : strmid get,get,0,_l-cnt
loop
strmid _c,get,_l-1,1
if _c==";" : strmid get,get,0,_l-1
;相対URLの取得
instr ains,get,":"
if ains==-1 : get=head+get
;URLの追加
peek ap,get,0
instr ains,value,get
aflg=(ains==-1)&&(get!="")&&(ap!='#')
if aflg : value+get+"\n"
index+ins+1
loop
return
#deffunc SetURL str
mref _adr,32
sdim adr,$ff : adr=_adr
return
#deffunc EnumURL val,val
mref _v,24 : mref _d,25
listmax=9
sdim get_list,$f,listmax
dim get_mode,listmax
get_list="href=","href=\"","href='","src=","src=\"","src='","http://","ftp://","mailto:"
get_mode=1,1,1,1,1,1,0,0,0
sdim head,$ff : head=adr
repeat listmax
_SetEnumMode get_list.cnt
_EnumURLEx _v,_d,get_mode.cnt
loop
return
#global
SetURL ""
; プログラムの始めに #include "enumurl.hsp" と記述すると、
; 以下の命令が使用出来るようになります。
;
;
; SetURL "string" - 絶対URL変換用のURLを設定
; EnumURL p1,p2 - HPデータ内のリンクを列挙
;
; ※以下は、モジュール側で使用する命令
; (プログラム側で使用する必要無し)
;
; _LowerCase p1 - アルファベットの大文字を小文字に変換
; _SetEnumMode p1 - 取得モードの設定
; _EnumURLEx p1,p2,p3 - HPデータ内のリンクを列挙
;
; ○SetURL
; SetURL "string" - 絶対URL変換用のURLを設定
; "string" : HPのURL
;
; URLを設定します。
; 取得したURLが相対URLの場合、
; このURLを連結して、絶対URLに変換します。
;
; 例えば、SetURL "http://meteoricstream.com/"と記述して、
; 取得した相対URLが"index.html"の場合は、
; "http://meteoricstream.com/index.html"という絶対URLに変換されます。
;
; ○EnumURL
; EnumURL p1,p2 - HPデータ内のリンクを列挙
; p1=変数 : 結果を格納する文字列変数
; p2=変数 : HTMLファイルのデータを格納した文字列変数
;
; p2で指定した文字列変数からURLを列挙し、結果をp1に返します。
; 対象となるURLは、以下の通りです。
;
; http:// 〜
; ftp:// 〜
; mailto: 〜
; href= 〜
; src= 〜
;
; なお、以下の場合は、正常に読み込む事が出来ません。
;
; ●URLの最初が「#」
; (ターゲット名と区別する為、意図的に読まないようにしている)
;
; ●URLの先端、終端以外の部分に「'」が含まれている
;
; ●URLに半角スペースが含まれている
; (ただし、href=""、src=""で囲まれている場合は読める。)
;
;
;■簡単な使用方法
;
; まず、SetURLで相対URL->絶対URL変換時に使用するURLを設定します。
; 特に必要が無い場合、若しくは、絶対URLに変換しない場合はSetURL ""と記述してください。
; また、以下の項目に注意する必要があります。
;
; ●ファイル名(index.html,main.html等)を含まないURLを指定する。
; (http://meteoricstream.com/index.htmlなどはNG。)
;
; ●転送URLでない事を確認する。
;
; ●終端に必ず「/」を付ける。
;
; 例) SetURL "http://meteoricstream.com/"
;
;
; 次に、EnumURLを実行して、実際にURLを取得します。
;
; 例) EnumURL value,data
;
;
#module
#deffunc _LowerCase val
mref string,24
strlen lclen,string
repeat lclen
if lcFLG==0{
peek pe,string,cnt
if pe>=129&&(pe<=159):lcFLG==1;2バイト文字判定
if pe>='A'&&(pe<='Z'):poke string,cnt,pe+32
}
else{
lcFLG=0
}
loop
return
#deffunc _SetEnumMode str
mref mode,32
_LowerCase mode
return
#deffunc _EnumURLEx val,val,int
mref value,24
mref _dat,25
mref delmodeflg,2
;初期化
index=0 : ins=0
strlen len,_dat
sdim dat,len+1 : dat=_dat
_LowerCase dat ;小文字変換
dat+" "
strlen modelen,mode
;区切りコードの設定
masklen=6
dim mask,masklen
mask=''','"','\n',' ','<','>'
repeat
await ;一応。(^^;
instr ins,dat,mode,index
if ins==-1 : break
;URLの取得
sdim get,$3e8 : strlen len,dat : flg=0
repeat len-(ins+index),ins+index
peek p,dat,cnt
wpeek p.1,dat,cnt
repeat masklen
if(p==mask.cnt)||(p.1==mask.cnt){
getstr get,_dat,ins+index+modelen,mask.cnt
if delmodeflg==0 : get=mode+get
flg=1 : break
}
loop
if flg : break
loop
;"'",";"の削除
_c=""
strmid _c,get,0,1 : if _c=="'" : peek get,get,1
strlen _l,get
repeat 2,1
strmid _c,get,_l-cnt,1
if _c=="'" : strmid get,get,0,_l-cnt
loop
strmid _c,get,_l-1,1
if _c==";" : strmid get,get,0,_l-1
;相対URLの取得
instr ains,get,":"
if ains==-1 : get=head+get
;URLの追加
peek ap,get,0
instr ains,value,get
aflg=(ains==-1)&&(get!="")&&(ap!='#')
if aflg : value+get+"\n"
index+ins+1
loop
return
#deffunc SetURL str
mref _adr,32
sdim adr,$ff : adr=_adr
return
#deffunc EnumURL val,val
mref _v,24 : mref _d,25
listmax=9
sdim get_list,$f,listmax
dim get_mode,listmax
get_list="href=","href=\"","href='","src=","src=\"","src='","http://","ftp://","mailto:"
get_mode=1,1,1,1,1,1,0,0,0
sdim head,$ff : head=adr
repeat listmax
_SetEnumMode get_list.cnt
_EnumURLEx _v,_d,get_mode.cnt
loop
return
#global
SetURL ""
次に、上記モジュールを使用した、サンプルコードを2点ほど。
まずは、単純にHTMLファイルを読み込んで、URLを列挙する例です。
#include "enumurl.hsp"
sdim value,$fde8
sdim dat,$fde8
;HTMLファイルの取得
dialog "html;htm",16
if stat==0 : stop
bload refstr,dat
;URLを列挙
SetURL ""
EnumURL value,dat
objsize winx,0
listbox list,winy,value
notesel value : notemax max
title "ヒット数:"+max
stop
sdim value,$fde8
sdim dat,$fde8
;HTMLファイルの取得
dialog "html;htm",16
if stat==0 : stop
bload refstr,dat
;URLを列挙
SetURL ""
EnumURL value,dat
objsize winx,0
listbox list,winy,value
notesel value : notemax max
title "ヒット数:"+max
stop
もう1点は、ちょっとアプリケーションっぽくしたサンプルコードですw
#include "enumurl.hsp"
title "簡易URL取得プログラム。(^^;"
;結果表示ウインドウ生成
;screen 2,300,480,0,dispx+10,dispy+10 ;HSPのバージョンが2.5の時はこっち
screen 2,300,480,12,dispx+10,dispy+10 ;2.55の時はこっちを有効にする
title "結果表示ウインドウ"
sdim list,$fde8 : objsize winx,24
mesbox list,winx,winy-24,5
objmode 1 : button "非表示",*hidewindow
gsel 2,-1
;メインウインドウ生成
screen 0,500,480,0,dispx-800>>1,dispy-480>>1
sdim msg,$fde8 : objsize winx>>1,24
mesbox msg,winx,winy-24,1
objmode 1
pos 0,winy-24 : button "開く",*open
pos winx>>1,winy-24 : button "URL取得",*getlist
stop
;開く
*open
dialog "html;htm",16,"HTMLファイル"
if stat==0 : stop
bload refstr,msg
gsel 0 : objprm 0,msg
stop
;URL取得
*getlist
gsel 2
title "結果表示ウインドウ - 取得中..."
;ウインドウ表示
gsel 0
ginfo 2 : mov.1=prmy
ginfo 3 : mov=prmx
gsel 2,1 : width ,,mov,mov.1
;URL列挙
sdim list,$fde8
SetURL ""
EnumURL list,msg
gsel 2 : objprm 0,list
;タイトル更新
notesel list : notemax max
title "結果表示ウインドウ - ヒット数 : "+max
stop
;非表示
*hidewindow
gsel 2,-1
stop
title "簡易URL取得プログラム。(^^;"
;結果表示ウインドウ生成
;screen 2,300,480,0,dispx+10,dispy+10 ;HSPのバージョンが2.5の時はこっち
screen 2,300,480,12,dispx+10,dispy+10 ;2.55の時はこっちを有効にする
title "結果表示ウインドウ"
sdim list,$fde8 : objsize winx,24
mesbox list,winx,winy-24,5
objmode 1 : button "非表示",*hidewindow
gsel 2,-1
;メインウインドウ生成
screen 0,500,480,0,dispx-800>>1,dispy-480>>1
sdim msg,$fde8 : objsize winx>>1,24
mesbox msg,winx,winy-24,1
objmode 1
pos 0,winy-24 : button "開く",*open
pos winx>>1,winy-24 : button "URL取得",*getlist
stop
;開く
*open
dialog "html;htm",16,"HTMLファイル"
if stat==0 : stop
bload refstr,msg
gsel 0 : objprm 0,msg
stop
;URL取得
*getlist
gsel 2
title "結果表示ウインドウ - 取得中..."
;ウインドウ表示
gsel 0
ginfo 2 : mov.1=prmy
ginfo 3 : mov=prmx
gsel 2,1 : width ,,mov,mov.1
;URL列挙
sdim list,$fde8
SetURL ""
EnumURL list,msg
gsel 2 : objprm 0,list
;タイトル更新
notesel list : notemax max
title "結果表示ウインドウ - ヒット数 : "+max
stop
;非表示
*hidewindow
gsel 2,-1
stop
最初に記事を書いた日:2017/10/30
この記事をシェアする
関連記事
- ・HSP2.xで、MIDIファイルのヘッダ情報を調べるモジュール
- ・HSP2.xで、LHA書庫の圧縮と解凍を実現するモジュール
要loadlib&llmod - ・HSP2.x系で、ファイルパスから、ファイル名やフォルダ名を取得するサンプルモジュール
- ・HSP2.x系で、アルファベットの大文字と小文字を相互変換するサンプルモジュール
- ・HSP2.x系で、平方根の近似値を整数で取得するサンプルモジュール
- ・HSP2.x系で、getkey、stick命令のキー番号を取得・表示するサンプルコード
- ・HSP2.x系で、円の中心に向かってグラデーションをかけるサンプルコード
- ・HSP2.x系用 ベンチマークプログラム ソースコード
- ・HSP2.xでMDIウインドウを作成するサンプルコード
要loadlib&llmod