Monday, June 25, 2018

用 MariaDB 切 URL 文字

字串的處理往往是因為應用上的需要,
而在"網站爬蟲"時, URL 常常是要分解的字串,
所以對 URL 的處理就有幾個部份:

A. 判斷是否為 URL :
以一般網站而言, 是 http:// 或 https:// 開頭, 後面至少有一個 / ,
所以可以用 正規表示式 來判斷, where url regexp '^https?://.*/.*$'

B. 如果是網頁 URL , 取出協定 :
因為預設 URL 是有 :// 字串, 所以可以用 position( in ) 來找到字串內的位置, 再用 left 剪裁.
比如: position( '://' in 'https://' ) = 6 表示 :// 從第 6 位開始(註1)
但是如果用 left( 'https://' , position( '://' in 'https://' ) ) 結果是 https:
雖然也是可以理解, 不過一般來說協定只要紀錄成 https , 所以長度要減 1 ,
就用 left( 'https://' , position( '://' in 'https://' ) -1 ) , 取得協定是 http 或 https

(註2)

另外的方法也可以用 regexp 判斷開頭是 https:// 就直接寫入 https 到指定欄位等作法.

C. 為了分析不同網站的 pattern , 所以取得 hostname 紀錄也是必要的,
比如: https://hostname/A/B/C 使用 / 區隔找出 hostname , 但左邊開頭有 // , 可能造成誤判,
所以分兩個階段, 先切成 https:// , hostname/A/B/C , 再取出 hostname ,
第一階段類似前一個步驟取協定的方式,
position( '://' in 'https://hostname/A/B/C' ) = 6
要取得 hostname/A/B/C , 原字串從右側取出總長度減去左側不要的字串長度
所以語法是: right( url , length( url ) - position( '://' in 'https://hostname/A/B/C' ) - 2 )
要 -2 的原因是搜尋 :// 時, 位置在 : , 如果沒有 -2 , 剩下的字串還會有 // , 盡量精簡就不留這個.

取得 hostname/A/B/C 之後, 再判斷一次 / , 就用
left(
right( url , length( url ) - position( '://' in 'https://hostname/A/B/C' ) - 2 ),
position(
'/' in
right( url , length( url ) - position( '://' in 'https://hostname/A/B/C' ) - 2 ) - 1
)
)

就可以取得 hostname , 存起來.
註1: MariaDB 字串位置從 1 開始, 有些軟體或資料庫字串會用 0 開始.
註2: 雖然大部分網址會用小寫字母, 不過有時候複製或轉換常有首字變大寫, 特別是經過 Office 軟體複製貼上, 所以比對時最好加上 lower() 處理.