<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XPath &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/xpath/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 01 Feb 2011 02:11:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>PHP : Webページからフィードの在り処をつきとめる</title>
		<link>https://blog.mach3.jp/2011/02/01/discover-feed-url-from-webpage.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 01 Feb 2011 02:11:20 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Feed]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1502</guid>

					<description><![CDATA[URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。 XPathでやってみた 「フィードをオートディスカバリーする XPath &#8211; IT戦記」を参考に DOMXpathで [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>URLからWebページにアクセスし、フィードのURLを抽出するスクリプトを書いてみるメモ。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TUbrP6o7c5I/AAAAAAAABKY/2iCkkM6rRiw/201102010202.png" alt="PHP : Webページからフィードの在り処をつきとめる"/></figure>



<p></p>



<span id="more-1502"></span>



<h2 class="wp-block-heading">XPathでやってみた</h2>



<p>「<a href="http://d.hatena.ne.jp/amachang/20080808/1218171377">フィードをオートディスカバリーする XPath &#8211; IT戦記</a>」を参考に<br />
<a href="http://php.net/manual/ja/class.domxpath.php">DOMXpath</a>で処理してみました。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$doc = DOMDocument::loadHTMLFile( $url );
$xpath = <span class="hljs-keyword">new</span> DOMXpath( $doc );
</code></span></pre>


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


<pre class="wp-block-code"><span><code class="hljs language-php">$q = <span class="hljs-string">'/html/head/link&#91;contains(@rel, "alternate")]'</span>
    . <span class="hljs-string">'&#91;@type="application/x.atom+xml" or @type="application/atom+xml" or '</span>
    . <span class="hljs-string">'@type="application/xml" or @type="text/xml" or '</span>
    . <span class="hljs-string">'@type="application/rss+xml" or @type="application/rdf+xml"]'</span>;
$eles = $xpath-&gt;query( $q );
</code></span></pre>


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



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


<pre class="wp-block-code"><span><code class="hljs language-php">$eles-&gt;item(<span class="hljs-number">0</span>)-&gt;getAttribute(<span class="hljs-string">"href"</span>);
</code></span></pre>


<h3 class="wp-block-heading">ファイナルコード</h3>



<dl>
<dt>関数にまとめたもの</dt>
<dd><a href="https://gist.github.com/420b0f92c210fd77d0c8">WebページからフィードのURLを抽出する。（XPath版）- GitHub</a></dd>
</dl>



<h2 class="wp-block-heading">DOMDocumentでもやってみる</h2>



<p>同じ処理を、試しに<a href="http://php.net/manual/ja/class.domdocument.php">DOMDocument</a>でも書いてみる事に。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$doc = DOMDocument::loadHTMLFile( $url );

$types = <span class="hljs-keyword">array</span>(
    <span class="hljs-string">"application/x.atom+xml"</span>,
    <span class="hljs-string">"application/atom+xml"</span>,
    <span class="hljs-string">"application/xml"</span>,
    <span class="hljs-string">"text/xml"</span>,
    <span class="hljs-string">"application/rss+xml"</span>,
    <span class="hljs-string">"application/rdf+xml"</span>
);
</code></span></pre>


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


<pre class="wp-block-code"><span><code class="hljs language-php">$feedUrl = <span class="hljs-keyword">null</span>;
$links = $doc-&gt;getElementsByTagName(<span class="hljs-string">"link"</span>);
<span class="hljs-keyword">for</span>( $i = <span class="hljs-number">0</span>; $i &lt; $links-&gt;length; $i ++ ){
    $link = $links-&gt;item( $i );
    <span class="hljs-keyword">if</span>( !stristr( $link-&gt;getAttribute(<span class="hljs-string">"rel"</span>), <span class="hljs-string">"alternate"</span> ) ||
        !in_array( $link-&gt;getAttribute(<span class="hljs-string">"type"</span>), $types ) ){ <span class="hljs-keyword">continue</span>; }
    $feedUrl = $link-&gt;getAttribute(<span class="hljs-string">"href"</span>);
    <span class="hljs-keyword">if</span>( !<span class="hljs-keyword">empty</span>($feedUrl) ){ <span class="hljs-keyword">break</span>; }
}
</code></span></pre>


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



<h3 class="wp-block-heading">ファイナルコード</h3>



<dl>
<dt>関数にまとめたもの。</dt>
<dd><a href="https://gist.github.com/77725d74919ace6f7475">WebページからフィードのURLを抽出する。（DOMDocument版）- GitHub</a></dd>
</dl>



<h2 class="wp-block-heading">まとめ</h2>



<p>Webページを取得してごにょごにょしたい場合はXPathが便利そう！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
