●PHP SimpleXMLElement:読み出しやすい、追加のみ
●PHP DOMDocument:追加・削除できる
●PHP DOMXPath:domを柔軟にアクセス
というわけで 最終的に任意のノードを変更する為、PHP DOMDocument で HTML を DOM としてパース(スクレイピング)。
●PHP DOMDocument:追加・削除できる
●PHP DOMXPath:domを柔軟にアクセス
というわけで 最終的に任意のノードを変更する為、PHP DOMDocument で HTML を DOM としてパース(スクレイピング)。
<?php $html=<<<EOT <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <div class="chapter" name="1章 ようこそ"> <h1>1-1節 remix.asia</h1> <div class="paragraph"> 文章 </div><!-- paragraph --> </div><!-- chapter --> <div class="chapter" name="2章 言語"><!-- 章の数だけ繰り返し --> <h1>2-1節 HTML</h1> <div class="paragraph"> HyperText Markup Language... </div><!-- paragraph --> <h1>2-2節 PHP</h1> <div class="paragraph"><!-- 節の数だけ繰り返し --> Hypertext Preprocessor </div><!-- paragraph --> </div><!-- chapter --> </body> </html> EOT; $dom = new DOMDocument( '1.0', 'UTF-8' ); if( false == $dom->loadHTML( $html ) ){ return;//error }の前提で...▼
XPathを使わないと タグの種類に制限を受ける。
$domNodeList = $dom->getElementsByTagName( 'div' ); echo '<hr />' . $domNodeList->length . '個'; foreach( $domNodeList as $v ){ echo '<br />' . $v->nodeValue; }▼
5個 1-1節 remix.asia 文章 文章 2-1節 HTML HyperText Markup Language... 2-2節 PHP Hypertext Preprocessor HyperText Markup Language... Hypertext Preprocessor
$domNodeList = $dom->getElementsByTagName( 'h1' ); echo '<hr />' . $domNodeList->length . '個'; foreach( $domNodeList as $v ){ echo '<br />' . $v->nodeValue; }▼
3個 1-1節 remix.asia 2-1節 HTML 2-2節 PHPXPathを使ってclassで絞り込む。
$domxpath = new DOMXPath( $dom ); $domNodeList = $domxpath->query( '//div[@class="chapter"]' ); echo '<hr />' . $domNodeList->length . '個'; foreach( $domNodeList as $v ){ echo '<br />' . $v->getAttribute('name'); }▼
2個 1章 ようこそ 2章 言語
echo '<hr />'; foreach( $domNodeList as $v ){ echo '<br />' . $v->nodeValue; }▼
1-1節 remix.asia 文章 2-1節 HTML HyperText Markup Language... 2-2節 PHP Hypertext Preprocessor上記を踏まえ、入れ子構造のタグとしてループさせる。
echo '<hr />'; foreach( $domNodeList as $v ){ echo '<br />*' . $v->getAttribute('name'); $domNodeListChild = $domxpath->query( './/h1', $v );//★ foreach( $domNodeListChild as $vc ){ echo '<br />**' . $vc->nodeValue; } }▼
*1章 ようこそ **1-1節 remix.asia *2章 言語 **2-1節 HTML **2-2節 PHP次回は、編集。