跳转到内容

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>
华夏公益教科书