[Go]RSS1.0を読み込む


RSSはXMLベースで、ATOMを混ぜると3つくらいのパターンがあるが、眺めた感じでは日本ではRDFが主だった。
ざっくりと、チャンネル情報と項目リストがある。

仕様の詳細は公式サイトで。

RDF Site Summary (RSS) 1.0 (resource.org)

RSS 2.0 Specification (Current) (rssboard.org)

RFC 4287 – The Atom Syndication Format (ietf.org)

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
  <channel rdf:about="https://example.com/rss">
    <title>test title</title>
    <link>https://example.com/link</link>
    <description>test description</description>
  </channel>
</rdf:RDF>

xmlnsに名前空間を定義しておくと、スコープ内で(名前空間):タグといった記述をすることで利用できる。

これをGoの標準パッケージencoding/xmlで認識できるようにタグをつけておく。

// Channel is a RSS channel.
type Channel struct {
	Url         string `xml:"about,attr"`
	Title       string `xml:"title"`
	Link        string `xml:"link"`
	Description string `xml:"description"`
}

タグの基本な書き方。

  • xml:(XML要素タグ名)
  • xml:(XML要素属性名),attr

尚、Goのencoding/xmlパッケージは名前空間の処理がいまいちで、取得した名前空間付きの値は”名前空間 タグ名”になることもあれば、”タグ名”だけになることも。

実際のタイトルとリンクは次のような要素のリストで表されている。

  <item>
    <title>test title</title>
    <link>https://example.com/link</link>
    <dc:creator>test creator</dc:creator>
    <dc:date>YYYY/MM/DD</dc:date>
  </item>

サンプル

rfull-development/cgi-rss-collect: This repository is a CGI for collector of RSS. (github.com)

これはRSSをダウンロードしてJSONで返すだけのもの。
CGIとして動作する。

curl -i (CGI設置URL)/?url=(RSS1.0のURL)

尚、コードを見てわかるように文字コードの変換処理は入れていない。
ご存じの通り、日本語サイトにはShift-JISという厄介者がいる。
RSSも例外ではなく、そのようなRSSには非対応。

現時点でも政府関連のサイトでShift-JISがあった。○○省とか。