PHP : Webページからフィードの在り処をつきとめる
この記事は賞味期限切れです。(更新から1年が経過しています)
URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。
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が便利そう!
コメント