身為就業輔導組長,每天必須檢查學校網站最新公告,卻無 RSS 訂閱功能,極不方便。靈機一動決定自己寫一個爬蟲,定時抓取公告頁面並產出標準 RSS 2.0 Feed,讓任何 RSS 閱讀器都能訂閱。
RssChannel。RssImage(Logo)與多個 RssItem(文章)。採用 XmlDocument 建構 XML 樹,優於 StringBuilder 字串拼接:結構強型別、自動處理逸出字元、不易產生格式錯誤,效能亦佳。
目標網站回傳的是鬆散 HTML,直接用 XmlDocument.Load 會失敗。解法:引入 SgmlReader(開源專案),將 HTML 解析為標準 XHTML,再載入 XmlDocument 操作 DOM。
public XmlDocument ConvertHtml2Xhtml(string html)
{
using (SgmlReader reader = new SgmlReader())
{
reader.DocType = "HTML";
reader.InputStream = new StringReader(html);
using (StringWriter stringWriter = new StringWriter())
using (XmlTextWriter writer = new XmlTextWriter(stringWriter))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
writer.Formatting = Formatting.Indented;
XmlDocument doc = new XmlDocument();
doc.Load(reader); // 直接從 SgmlReader 載入,自動完成 HTML→XHTML 轉換
return doc;
}
}
}
/html/body/div[2]/table/tr/td[3]/ul/li)。GetElementsByTagName 全域搜尋,減少節點遍歷開銷。<a> 內文)、連結(href)、發布日期(同列 <span>)、摘要(進入詳細頁再抓或直接取標題)。RssItem 集合,最後由 RssDocument 輸出完整 XML。rss.xml 放至網站公開目錄,或上傳至靜態空間(GitHub Pages、Firebase Hosting 等)。完整專案(含 SgmlReader 參考、RSS 實體類、爬蟲邏輯、排程部署說明)已上傳:點此下載
這個小專案展示了「以標準工具解析非標準 HTML → 結構化資料 → 輸出標準格式」的經典資料管線模式,可輕易擴充至其他無 RSS 網站。