Mach3.laBlog

PHP : Webページからフィードの在り処をつきとめる

この記事は賞味期限切れです。(更新から1年が経過しています)

URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。

PHP : Webページからフィードの在り処をつきとめる

XPathでやってみた

フィードをオートディスカバリーする XPath – IT戦記」を参考に
DOMXpathで処理してみました。

$doc = DOMDocument::loadHTMLFile( $url );
$xpath = new DOMXpath( $doc );

DOMXPathはDOMDocumentをコンストラクタの引数に食べさせて使います。

$q = '/html/head/link[contains(@rel, "alternate")]'
    . '[@type="application/x.atom+xml" or @type="application/atom+xml" or '
    . '@type="application/xml" or @type="text/xml" or '
    . '@type="application/rss+xml" or @type="application/rdf+xml"]';
$eles = $xpath->query( $q );

基本的には先述の記事と同じ処理。
「rel属性に”alternate”を含み、尚且つtype属性がそれっぽいlink要素をください」
というクエリです。

DOMXPath::queryにクエリを渡せば実行結果をDOMNodeListで返してくれますので、
こんな感じに、条件にあったlink要素の1個目のhref属性を取得。

$eles->item(0)->getAttribute("href");

ファイナルコード

関数にまとめたもの
WebページからフィードのURLを抽出する。(XPath版)- GitHub

DOMDocumentでもやってみる

同じ処理を、試しにDOMDocumentでも書いてみる事に。

$doc = DOMDocument::loadHTMLFile( $url );

$types = array(
    "application/x.atom+xml",
    "application/atom+xml",
    "application/xml",
    "text/xml",
    "application/rss+xml",
    "application/rdf+xml"
);

下準備。DOMDocumentを生成しつつ、属性値のリストを作っておく。

$feedUrl = null;
$links = $doc->getElementsByTagName("link");
for( $i = 0; $i < $links->length; $i ++ ){
    $link = $links->item( $i );
    if( !stristr( $link->getAttribute("rel"), "alternate" ) ||
        !in_array( $link->getAttribute("type"), $types ) ){ continue; }
    $feedUrl = $link->getAttribute("href");
    if( !empty($feedUrl) ){ break; }
}

link要素のリストを取得してループでぐるりとまわします。
何をしているのかわかりやすいですが、XPathの方がスマートな印象。

ファイナルコード

関数にまとめたもの。
WebページからフィードのURLを抽出する。(DOMDocument版)- GitHub

まとめ

Webページを取得してごにょごにょしたい場合はXPathが便利そう!

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

ITキヲスク | 2011年1/30~2/5の週間ブックマークd41d8cd98f00b204e9800998ecf8427e