網際網路上海量資料以 HTML 格式呈現,若能將 HTML 修正為標準 XML 再用 XPath 查詢最為理想。但現實中 HTML 結構靈活、常缺標籤、巢狀錯誤,難以可靠轉換為 XML。此時採用文字解析方式擷取資料較為務實。
以下展示如何使用類 SQL 語法定義文字結構描述,並查詢即時匯率資料。
CREATE OR REPLACE SCHEMA txt TYPE txt URL '';
CREATE OR REPLACE TABLE txt.huilv
URL 'https://www.boc.cn/cn/common/service.JSP?querytype=bydate&t_oneday=2007/10/01'
CHARSET 'gb2312'
ROW_XPATH '/html/body/table/tr' (
P1 VARCHAR ELEMENT 'td[1]',
P2 VARCHAR ELEMENT 'td[2]',
P3 VARCHAR ELEMENT 'td[3]',
P4 VARCHAR ELEMENT 'td[4]',
P5 VARCHAR ELEMENT 'td[5]',
P6 VARCHAR ELEMENT 'td[6]'
);
URL:目標網頁位址,含查詢參數 (日期 2007/10/01)CHARSET:網頁編碼 (gb2312)ROW_XPATH:定位每筆資料的列節點 (這裡假設表格結構)ELEMENT:以 CSS 選擇器方式提取欄位文字內容SELECT * FROM txt.huilv;
引擎將自動下載網頁、以文字方式解析表格列、提取六欄資料並回傳結果集。
| 維度 | XML/XPath | 文字解析 |
|---|---|---|
| 適用對象 | 標準 XML、XHTML | 任意 HTML、非結構化文字 |
| 容錯性 | 低 (需 well-formed) | 高 (可忽略缺標籤、錯誤巢狀) |
| 效能 | 較高 (DOM/SAX) | 較低 (正則/字串搜尋) |
| 維護性 | 高 (結構化查詢) | 中 (依賴固定位置/關鍵字) |
regexp_extract(html, '<td>([^<]+)</td>')<table>、<tr>、<td> 標籤層級,轉為行列模型 (如本範例)CREATE OR REPLACE PROCEDURE get_huilv(p_date VARCHAR) RETURN ROWSET AS
BEGIN
EXECUTE IMMEDIATE '
ALTER TABLE txt.huilv SET
URL ''https://www.boc.cn/cn/common/service.JSP?querytype=bydate&t_oneday='' || p_date;
SELECT * FROM txt.huilv;
END;
-- 呼叫範例
SELECT * FROM get_huilv('2024/01/15');
CHARSET 正確,否則中文會亂碼同樣技術可應用於:
核心模式皆為:定義外部結構描述 → 映射目標 URL/編碼/解析規則 → 標準 SQL 查詢。