跳轉到內容

XQuery/頁面抓取技術概述

來自華夏公益教科書,開放的書籍,開放的世界

您希望獲得一個工具包,用於從網頁中提取資訊,即使這些網頁不是格式良好的 XML 檔案。

XQuery 是一個理想的工具包,用於操作格式良好的 HTML;您只需使用 doc() 函式,例如 doc('http://www.example.org/index.html') 或 doc('/db/path/to/index.html')。但是,如果網頁不是格式良好的 XML,您將收到有關原始碼格式不正確的錯誤訊息。

幸運的是,有一些程式可以將 HTML 檔案轉換為格式良好的 XML 檔案。

eXist 提供了一些這樣的工具。其中之一是 httpclient 模組的 get 函式,httpclient:get()。要使用此函式,您需要透過修改 conf.xml 檔案來啟用 httpclient 模組,以便在您下次啟動 eXist 時載入該模組。取消註釋以下行

   <module class="org.exist.xquery.modules.httpclient.HTTPClientModule"
      uri="http://exist-db.org/xquery/httpclient" />

例如,以下示例對 IBM 網站上所有提要的列表執行 HTTP GET

let $feeds-url := 'http://www.ibm.com/ibm/syndication/us/en/?cm_re=footer-_-ibmfeeds-_-top_level'
let $data := httpclient:get(xs:anyURI($feeds-url), true(), <Headers/>)
return $data

有時 HTML 的格式錯誤程度很高,即使 httpclient:get() 也無法修復它。例如,如果一個元素有兩個 @id 元素,您將收到錯誤訊息“錯誤 XQDY0025:元素具有多個 'id' 屬性”。在這種情況下,您可能需要下載 HTML 原始碼並清理 HTML,使其足夠格式良好,以便 eXist 可以解析其餘部分。然後,將檔案儲存在您的資料庫中,並使用 util:parse-html() 函式(它將文字透過 Neko HTML 解析器,使其格式良好)。

以下 XQuery 將清理 HTML(作為文字檔案儲存,因為它仍然格式錯誤)

let $html-txt := util:binary-to-string(util:binary-doc('/db/html-file-saved-as-text.txt'))
let $data := util:parse-html($html-txt)
return $data

使用簡單的回顯指令碼測試您的 HTTP 客戶端

[編輯 | 編輯原始碼]

一旦您在

echo.xq 的原始碼

xquery version "1.0";
declare namespace httpclient="http://exist-db.org/xquery/httpclient";
let $feeds-url := 'http://www.ibm.com/ibm/syndication/us/en/?cm_re=footer-_-ibmfeeds-_-top_level'
let $http-get-data := httpclient:get(xs:anyURI($feeds-url), true(), <Headers/>)
return
<echo-results>
   {$http-get-data}
</echo-results>
華夏公益教科書