C#でHTML文書からRSSのURLを取得するサンプル。

このサンプルでは以下の処理を行う。
1.テキストボックスに対象となるHTML(WebサイトのURL)を指定。
2.[RSSのURL取得]ボタン押下。
3.取得したRSSが表示される。
GUIデザインでは、FormにtextBox1と、button1を貼り付ける。

ソースコードは以下の通り。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
/*
HTML文書の中からRSSのURLを取得する。
RSSのURL情報は、HTML内に以下のような形式で保存されている。
<link type="application/rss+xml" title="RSS"
href="http://www.osadasoft.com/rss.xml" />
*/
WebBrowser webBrowser1 = new WebBrowser();
webBrowser1.Navigate(textBox1.Text);
while (!webBrowser1.IsBusy)
{
// 無限ループに陥らないようイベントを処理
Application.DoEvents();
}
// サイトによっては少し待たないと取得に失敗する
System.Threading.Thread.Sleep(500);
// HTML読み込み直後、最新の情報に更新させる
Application.DoEvents();
// HTML解析
HtmlDocument htmlDoc = webBrowser1.Document;
HtmlElementCollection elLinkCol =
htmlDoc.GetElementsByTagName("link");
// <link>タグを1つ1つ調べる
bool mFlg = false;
for (int i = 0; i < elLinkCol.Count; i++)
{
HtmlElement elLink = elLinkCol[i];
// <link>内のtype属性を確認し、属性値が
// "application/rss+xml"か確認
if (elLink.GetAttribute("type").Equals("application/rss+xml") &&
elLink.GetAttribute("title").Equals("RSS") )
{
// 一致した場合、メッセージボックスでURLを表示
MessageBox.Show(
elLink.GetAttribute("href"),
"RSSのURL取得",
MessageBoxButtons.OK);
mFlg = true;
}
}
if (!mFlg)
{
MessageBox.Show(
"取得できませんでした。",
"RSSのURL取得",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
}
}
}
}
[補足]
RSSを使用しているホームページのHTMLには、大抵以下のようなRSSに関する情報が追加されている。
<html> <head> : <link type="application/rss+xml" title="RSS" href="http://www.osadasoft.com/rss.xml" /> </head> <body> : </body> </html>
このサンプルでは、<link>タグ内のtype属性の値が”application/rss+xml”のものを探し、href属性の値を取得している。
本当は、GetElementByIdを使って属性値を直接探そうとしたけど、何故かnullしか返らず断念。
問題解決できるなら、GetElementByIdを使った方が良さそう。
あと、HTMLを解析する際、必ずHTMLの読み込み完了を待ってからでないと、HtmlDocumentがnullとなってしまう。
読み込み完了を待ってから(WebBrowserのIsBusyで確認)解析する必要があります。
更に、アプリケーションのイベントもきちんと待たないとダメっぽいです(DoEvents)。
で、更に、Webサイトによっては読み込みに時間がかかるせいか、少し待ってから(Sleep)でないと失敗する場合があります。
このサンプルでは、こんな意外な落とし穴を避けながら作成しています。






