XQuery/維基百科頁面抓取
外觀
< XQuery
頁面抓取允許任何網頁成為適合轉換的原始資料的來源。此示例獲取維基百科當前事件頁面上的資料 2007 年 9 月 24 日 並轉換為 一個簡單的 HTML 頁面
XQuery 頁面抓取器的關鍵元件是
- fn:doc 函式,它接受一個 URL 並將頁面檢索為 XML。許多頁面格式不正確的 XML,但維基百科頁面是格式良好的。
- 如果頁面具有預設名稱空間,則設定名稱空間。此頁面具有 "http://www.w3.org/1999/xhtml" 的預設名稱空間,因此必須宣告名稱空間,並在訪問頁面的 XML 的路徑表示式中使用其名稱空間字首。
- 選定內容路徑的標識。在本例中,內容位於具有“description”類的 td 標籤中。
- 重新設定任何相對 URL。此處指向維基百科文章的連結具有相對 URL。為了重新設定它們,XML 被序列化為一個字串,並使用 util:serialize(),使用 replace 編輯相對 URL,並將字串使用 util:parse() 轉換回 XML。
在此示例中,需要進行一些日期重新格式化,因為頁面 URL 中的日期格式不是 XML 格式化的日期。包含指向前一天和後一天的連結,利用 XQuery 日期算術。
declare namespace h= "http://www.w3.org/1999/xhtml" ;
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
declare variable $months :=
("January","February","March","April","May","June","July","August","September","October","November","December")
;
declare function local:wikidate($date as xs:date) as xs:string {
concat(year-from-date($date),"_",
$months[month-from-date($date)],"_",
day-from-date($date)
)
};
declare function local:displaydate($date as xs:date) as xs:string {
concat(day-from-date($date)," ",
$months[month-from-date($date)],", ",
year-from-date($date)
)
};
declare function local:add-base($element , $base as xs:string, $delimiter as xs:string) {
let $evtext := util:serialize($element,())
let $evtext := replace($evtext,
concat ("href=",$delimiter,"/"),
concat("href=",$delimiter,$base,"/")
)
return util:parse($evtext)
};
let $date := xs:date(request:get-parameter("date",()))
let $wikidate := local:wikidate($date)
let $url := concat("http://en.wikipedia.org/wiki/Portal:Current_events/",$wikidate)
let $wikipage := doc($url)
let $desc := $wikipage//h:td[@class="description"]
let $nextDay := $date + xs:dayTimeDuration("P1D")
let $previousDay := $date - xs:dayTimeDuration("P1D")
return
<html>
<body>
<h1>Current events from <a href="{$url}">Wikipedia</a></h1>
<h2>Wiki Events for
<span style="font-size:12;"><a href="wikidate.xq?date={$previousDay}">{local:displaydate($previousDay)}</a></span> 
{local:displaydate($date)}
<span style="font-size:12;"><a href="wikidate.xq?date={$nextDay}">{local:displaydate($nextDay)}</a></span> 
</h2>
{
local:add-base($desc/*,"http://en.wikipedia.org",'"')
}
</body>
</html>