前回はCSSセレクターを使用して簡単にjsoupでHTMLの個別要素を取得する方法を紹介した。今回は、いよいよRSSフィード自体のURLを解析する方法を説明する。

前回のコードでYahoo!ニュースの「国内」カテゴリーの総合RSSのURLである https://headlines.yahoo.co.jp/rss/all-dom.xml を取得出来ているはずなので、この中身を解析していく。

jsoupのウェブサイトを見ると、簡潔な紹介として「Java HTML Parser」と書かれている。勿論、body()メソッドなどHTMLに特化したメソッドも多く存在するが、別にHT”ML”に限らず、X”ML”などタグで構造化されたMarkup Language(マークアップ言語)であれば、基本的に何でも解析できる。

HTML Documentの取得

まずはHTML Documentの取得で説明した方法と同様に、以下のようにRSSのURLについてDocumentを取得する。userAgentとtimeoutは任意の値で良い。

Chromeでxmlページを開くと、ツリー構造が見やすく表示され、余分なタグは閉じる事もできる事が分かる。

更新日時の取得

スクレイピングを行う上で、まず必要な情報はRSSの更新日時である。それに該当する情報は<lastBuildDate>タグに書かれている。以下のようにしてタグの内容を取得する。

取得したdateStrの形式は

のようになっている。これはUSロケールの典型的な日時の表示形式であり、java.util.Date型に変換するなら、SImpleDateFormatクラスを利用して以下のようにすれば良い*1。

個別記事情報の取得

次に、肝心の個別記事情報を取得する。記事情報は<item>タグで囲まれ、以下のような構造になっていることが分かる。

これは以下のようにパースする。個別記事情報が入っているitemから更にgetElementsByTagを呼び出している。item.getElementsByTag(“title”)は要素1つのElementsであるが直接text()を呼び出すと、内部の文字列だけを取得できる。なお、Elementsの要素数が複数の場合は半角スペース区切りとなる。

上記のコードは冗長だが、以下のようなメソッドを作っておくと便利だろう。

titleとcategoryは単純に文字列、pubDateは前述のSimpleDateFormatで処理できる。問題となるのがlinkである。このURLは末尾が以下のようなよく分からない文字列の並びとなっている。

linkで取得できるURLを同じようにJsoup.connect(link)で取得してもうまく記事のページに飛ばない。それは、このURLはリダイレクトが行われるからである。次回は、jsoupにおいてリダイレクトを扱う方法を見る。

*1:SimpleDateFormatでの日時フォーマットの指定の仕方についてはjavadocを参照されたい。