Zend_Dom_Queryで遊ぶ
高木さんとこの日記
http://d.hatena.ne.jp/takagimasahiro/20080717
で、Zend_DomとかあったんでincubatorとZend_Httpしかチェックしてなかった私は、ん?とか思ったんですが、いきなりstandardのsvnに入ってるんですね。
あれー、Zend_Http_Response_Parser
http://framework.zend.com/wiki/display/ZFPROP/Zend_Http_Response_Parser+-+Jason+Eisenmenger
はどうすんのーとか疑問におもっちゃいけませんね。
ということで、ちょっと遊んでみる。
<?php //@see http://en.yummy.stripper.jp/?eid=800109 $html = <<<HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="ja" xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>サッカーニュース</title> <body> <ul class="news"> <li> <a href="http://sportsnavi.yahoo.co.jp/soccer/index.html">Cロナウドが休日返上宣言!</a> </li> <li> <a href="http://sportsnavi.yahoo.co.jp/soccer/italia.html">123</a> </li> <li> <a href="http://test.org/article/vender-15.html">バルセロナが前回王者セビージャを下す=スペイン国王杯</a> </li> <li> <a href="../soccer/index.html">ユベントス奮闘、5−3でエンポリを下す=イタリア杯</a> <a href="testhtm.htmll">ユベントス</a> </li> </ul> </body> </html> HTML; require_once 'Zend/Dom/Query.php'; $q = new Zend_Dom_Query($html); var_dump($q->query('ul.news>li')->getXpathQuery()); echo "----------------------------------------";echo PHP_EOL; class MyResultFilterIterator extends FilterIterator{ public static $searchAttribute; public static $searchvalue; public function __construct( Iterator $it , $searchAttribute, $searchvalue){ parent::__construct( $it ); self::$searchAttribute = $searchAttribute; self::$searchvalue = $searchvalue; } function accept(){ return !strcmp(parse_url($this->current()->getAttribute(self::$searchAttribute), PHP_URL_HOST), self::$searchvalue); } } $my = new MyResultFilterIterator($q->query('a'), 'href', 'test.org'); foreach ($my as $m) { echo $m->nodeValue; echo PHP_EOL; } echo "----------------------------------------";echo PHP_EOL; foreach($q->query('a') as $count => $domElement) { $result[$count]['TEXT'] = $domElement->nodeValue; $result[$count]['link'] = $domElement->getAttribute('href'); } var_dump($result);
結果
string(35) "//ul[contains(@class, ' news ')]/li" ---------------------------------------- バルセロナが前回王者セビージャを下す=スペイン国王杯 ---------------------------------------- array(5) { [0]=> array(2) { ["TEXT"]=> string(37) "Cロナウドが休日返上宣言!" ["link"]=> string(47) "http://sportsnavi.yahoo.co.jp/soccer/index.html" } [1]=> array(2) { ["TEXT"]=> string(3) "123" ["link"]=> string(48) "http://sportsnavi.yahoo.co.jp/soccer/italia.html" } [2]=> array(2) { ["TEXT"]=> string(78) "バルセロナが前回王者セビージャを下す=スペイン国王杯" ["link"]=> string(38) "http://test.org/article/vender-15.html" } [3]=> array(2) { ["TEXT"]=> string(75) "ユベントス奮闘、5−3でエンポリを下す=イタリア杯" ["link"]=> string(20) "../soccer/index.html" } [4]=> array(2) { ["TEXT"]=> string(15) "ユベントス" ["link"]=> string(13) "testhtm.htmll" } }
Zend_Dom_Query->query('')->getXpathQuery();
てなcss selectorからxpathの変換は良い感じ