- ベストアンサー
スクレイピングPHPにおける複数spanの表示方法
- PHPによるスクレイピングで、複数のspan要素を表示する方法について解説します。
- class="maker"内に含まれる複数のspan要素を全て表示するには、適切なXPathを使用して抽出する必要があります。
- また、特定のspan要素を優先的に表示させるためには、XPathの評価順序を調整することで実現できます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
$xpath->evaluate() において複数の要素を取得するのはできないようです。 2つ挙げておられる方法の対応を考えてみました。 ■spanを両方とも表示させたい場合 ***************************************** <?php class SimpleXMLExtended extends SimpleXMLElement { public function addCData($data) { $dom = dom_import_simplexml($this); $dom->appendChild($dom->ownerDocument->createCDATASection($data)); } } $xml = new SimpleXMLExtended('<rss version="2.0"></rss>'); $channel = $xml->addChild('channel'); $channel->addChild('title', 'TEST RSS'); $dom = new DOMDocument; @$dom->loadHTMLFile('http://hoge.com/index.html'); $xpath = new DOMXPath($dom); foreach ($xpath->query('//*[@class="Table100"]') as $node) { $item = $channel->addChild('item'); $cdata = array(); array_push( $cdata, $xpath->evaluate('string(.//*[@class="Name"]/h1)', $node) ); array_push( $cdata, $xpath->evaluate('string(.//*[@class="Price"])', $node) ); for( $i=1; $i <= $xpath->query('//*[@class="maker"]/span')->length; $i++ ) { array_push( $cdata, $xpath->evaluate('string(.//*[@class="maker"]/span['.$i.'])', $node) ); } $item->addChild('description')->addCData(implode('<br>', $cdata)); } header('Content-Type: application/xml; charset=utf-8'); $xml->asXML('php://output'); ***************************************** 1.$cdataの配列を用意 addCDataに渡すデータをこの配列に入れておく。 2.spanの全要素を取得して配列に入れる $xpath->query('//*[@class="maker"]/span')->lengthを使うことで、 span要素の数が取得できますので、要素数分のデータをfor文で取得し、 $cdataの配列に入れる。 3.addCDataの部分で$cdataを渡す。 ■spanの最後の要素のみ出力する ***************************************** $xpath->evaluate('string(.//*[@class="maker"]/span)', $node), ↓ $xpath->evaluate('string(.//*[@class="maker"]/span[last()])', $node), ***************************************** spanの後ろに[last()]をつけることで最後のspan要素を取得することができる。 というような感じで2つの方法の回避策を考えてみました! 参考になれば幸いです。
お礼
有難うございます。 出来ました。本当に助かりました。 深く御礼申し上げます。