HTML内のRSS情報を取得する

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)でないと失敗する場合があります。
このサンプルでは、こんな意外な落とし穴を避けながら作成しています。


Tagged: , ,

Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*