スクレイピングPHPにおける複数spanについて
外部のホームページのソースを拾いRSS化するPHPを作成しました。
*****************************************
外部ホームページ http://hoge.com/index.html
*****************************************
<html>
<table class="Table100">
<tr>
<th class="Name"><h1>えんどう豆</h1></th>
<td class="Price">254</td>
<td class="maker">
<span class="a1">メーカー</span>
<span class="a2">遠藤農園</span>
</td>
</tr>
</table>
</html>
*****************************************
スクレイピングPHP http://hagedebu.jp/index.php
*****************************************
<?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');
$item->addChild('description')->addCData(implode('<br>', [
$xpath->evaluate('string(.//*[@class="Name"]/h1)', $node),
$xpath->evaluate('string(.//*[@class="Price"])', $node),
$xpath->evaluate('string(.//*[@class="maker"]/span)', $node),
]));
}
header('Content-Type: application/xml; charset=utf-8');
$xml->asXML('php://output');
************************************************
問題点
このPHPでは、
えんどう豆
254
メーカー
と表示されてしまいます。
<td class="maker">
<span class="a1">メーカー</span>
<span class="a2">遠藤農園</span>
</td>
class="makerに複数のspanが入っているため、2つめのspanを認識しません。
当方が表示させたいのは下記のようにspanを両方とも表示させたいです。
またはひとつしか表示させることができない場合は、「メーカー」ではなく「遠藤農園」を優先表示させたいです。
このように表示させるためにはどうすればよいでしょうか?
希望表示
えんどう豆
254
メーカー
遠藤農園
または
えんどう豆
254
遠藤農園
よろしくお願いいたします。
お礼
なるほどです。 なんか直観には反してますが…ブラウザ側でもnokogiriと同じようにテキスト化するメソッドを定義しているのであって、本当はcapybaraと同じようなResult:0x0325d6honyaefccf0f8みたいな表示なんでしょうか? 兎に角、textメソッドを使ってみたいと思います。ありがとうございます