スクレイピングをするときに内部リンクを相対パスで書かれているサイトもURLとして取得したい時があります。
そのようなときはURLへの変換が必要です、
メゾットが見当たらなかったので自作のメゾットを作成しました。
相対パスのパターンは、先頭が「/」「./」「../」「それ以外」で考えています。
function relativesub(targeturl,itemURL){//(【対象のURL】,【相対パス】)
var reitemURL = "";//リターンURL
//対象のURLを加工する
if(targeturl.match(/http[s]*?:\/\/[\s\S]*\/[\s\S]*?\.[\s\S]*?/)){//ファイル名があったら削除
var tmpbeseurl = targeturl.replace(/\/[^\/]*?$/,"");
}else if(targeturl.match(/\/$/)){//スラッシュで終わっていたら削除
var tmpbeseurl = targeturl.replace(/\/$/,"");
}else{
var tmpbeseurl = targeturl
}
var rootURL = targeturl.match(/http[s]*?:\/\/[\s\S]*?\//)[0].replace(/\/$/,"");//ルートURL取得
//パターンによって加工
if(itemURL.match(/^\//)){//スラッシュから始まっていたらルート
reitemURL = rootURL + itemURL;
}else if(itemURL.match(/^\.\//)){//./から始めっていたら.を消して元URLを連結
reitemURL = tmpbeseurl + itemURL.replace(/^\./,"/");
}else if(itemURL.match(/^\.\.\//)){//../がある場合はループしてパスを作成
while(itemURL.match(/^\.\.\//)){
itemURL = itemURL.replace(/^\.\.\//,"");
tmpbeseurl = tmpbeseurl.match(/http[s]*?:\/\/[\s\S]*\//)[0].replace(/\/$/,"");
}
reitemURL = tmpbeseurl + "/" + itemURL;
}else{
reitemURL = tmpbeseurl + "/" + itemURL;
}
return reitemURL;
}URL = relativesub(targeturl,itemURL);//(【対象のURL】,【相対パス】)
でメゾットを呼び出し戻り値でURLを取得します。

コメント