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

この記事をシェアする

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

関連記事

Meteoric Streamについて

管理人

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