Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> HSP2 -> HSP2.xで、HTMLファイル内のリンク先を列挙するサンプルコード(モジュール付き)

HSP2.xで、HTMLファイル内のリンク先を列挙するサンプルコード(モジュール付き)

Hot Soup Processor 2.x系で使える、HTMLソース内の、URLを列挙するためのサンプルモジュールとサンプルコードです。

スクレイピングとかの目的で使えると思います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 ""

次に、上記モジュールを使用した、サンプルコードを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

もう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

最初に記事を書いた日:2017/10/30

この記事をシェアする

このエントリーをはてなブックマークに追加

関連記事

資料室のトップに戻る
Windowsソフト、iPhoneアプリ、ゲーム音楽素材の「Meteoric Stream」 -> 資料室 -> HSP2 -> HSP2.xで、HTMLファイル内のリンク先を列挙するサンプルコード(モジュール付き)
▲Top English