ここで、配列がキャッシュされます。
HTMLScraping Class ReadMe
概要説明
- 動作環境
- 配布アーカイブのダウンロード
- 注意
- HTMLの整形処理について
- 実体参照について
- 名前空間について
- リファレンス
- HTMLScraping->__construct()
- HTMLScraping->getXmlObject()
- HTMLScraping->getXhtml()
- HTMLScraping->convertPath()
- HTMLScraping->dumpElement()
- HTMLScraping->emulateLastModified()
- HTTP_Requestについての補足
動作環境
必須。
以下のいずれかが必須。
キャッシュ処理を行う場合は必須。
配布アーカイブのダウンロード
» 0.1 (alpha) issued 2007-05-24
注意
HTMLの整形処理について
HTMLの整形処理は、Tidyが利用可能であればこれを利用し、利用不可の場合は替わりにHTMLParserを使用します。Tidyのほうが高速で、リソースの消費も少なく、より正確な処理が期待できますが、これは現在のPHPでは、標準ではインストールされないため、システムの管理者権限がある場合は、別途にインストールしてください。
整形処理では、XHTML 1.0 Transitionalに準拠じて要素が再構築されます。このため、ドキュメントツリーは、整形処理の前後で異なる場合がある点に注意してください。例えば「
HTMLParserによる整形処理では、XHTML 1.0 Transitionalでは無効な要素(例えばEMBEDやFRAME)や、必須要素の欠落している要素(例えば)は除去されます。こうした処理内容は、その定義ファイルである、配布アーカイブ中のxhtml1-transitional_dtd.inc.phpを修正することで変更可能です。
SCRIPTとSTYLEはその子要素も含めてすべて削除されます。これらを削除せずに残す代替のコードを、HTMLScraping.class.php中にコメントアウトで記述しています。このコードを利用した場合、これらの要素の子要素は(あれば)CDATAセクションに変更されます。その他の、XMLパーサにとって安全ではない可能性のある要素は、整形処理前に適宜変更されます。
なぜマイクロコントローラは、小規模システムでのみ使用できますか?実体参照について
外部エンティティを解析しないXMLパーサでは、XMLでの定義済みエンティティ(<、>、&、"、')以外のエンティティ参照が、パース対象のドキュメント中に存在する場合はパースに失敗しますが、これはSimpleXMLも同様のため、HTMLScraping->getXmlObject()は、SimpleXMLオブジェクトを生成する際に、HTMLドキュメント中のすべての&記号を&に置換しています。つまり、ここで生成したSimpleXMLオブジェクト内では、例えば は となっています。
例えば、HTMLドキュメント中のTITLE要素が以下であった場合。
FOO&BAR
SimpleXMLオブジェクトの要素をString型にキャストし、要素(の子要素のテキストノード)の文字列を取り出す場合、定義済みのエンティティ参照は文字列� �展開されます。
echo $simplexml->head->title; // FOO&BAR
SimpleXMLElement->asXML()によるXML文字列へのダンプでは、エンティティ参照は展開されないので、オブジェクトの生成時に&が置換された&が、そのまま出力されます。
echo $simplexml->head->title->asXML(); //FOO&BAR
HTMLScraping->dumpElement()は、SimpleXMLElement->asXML()の出力を、&を&に置換するユーティリティです。
echo $htmlscraping->dumpElement($simplexml->head->title); //FOO&BAR
XMLHttpRequestを含むXMLパーサに、HTMLScraping->getXmlObject()で生成したSimpleXMLオブジェクトを、XML文字列にダンプして出力する際には、外部エンティティを解析しないXMLパーサに対しては、SimpleXMLElement->asXML()を使用する必要があるでしょう。例えば、Internet ExplorerのXMLHttpRequestは、やはり外部エンティティを参照しないようなので、配布アーカイブに含まれるサンプルアプリケーションのうち、Ajaxクライアントへの応答を想定しているtest_ajax.phpでは、SimpleXMLElement->asXML()でXML文字列を出力しています(そして、Ajax側で、replace(/&/g, "&")で&を&に置換しています)。これをウェブブラウザに出力する場合は、SimpleXMLElement->asXML()に替えて、HTMLScraping->dumpElement()を使用してください。
名前空間についての注意
HTMLScraping->getXmlObject()でSimpleXMLオブジェクトを生成する際には、XMLNS属性を除去しています。これは、SimpleXMLElement->xpath()で、名前空間を持つ要素に対してXPathクエリーを実行する場合、SimpleXMLElement->registerXPathNamespace()を使用し、デフォルトのものも含めてクエリーの対象となる名前空間を、あらかじめSimpleXMLオブジェクトに登録しておく必要がありますが、PHP 5.1.6でこれが正常に動作しない事例があったための措置です(ちなみに公式には、SimpleXMLのXPath関連の機能は5.2.0以上で利用可能ということになっています)。
サブネットマスクを使用する方法このため、HTMLScraping->getXmlObject()で生成したSimpleXMLオブジェクトに対してSimpleXMLElement->xpath()を使用する場合には、名前空間を登録し、XPath式に名前空間接頭辞を含める必要はありません。
リファレンス
HTMLScraping->__construct()
class HTMLScraping {
__construct ( [string $cache_dir [, integer $gc_max_lifetime [, integer $gc_divisor]]] )
}
新しいHTMLScrapingオブジェクトを作成します。
パラメータ
- cache_dir
-
キャッシュファイルの保存先ディレクトリ名です。未指定の場合または無効なディレクトリ名が指定された場合は、キャッシュ処理は一切行われません。
- gc_max_lifetime
-
キャッシュファイルの削除処理が行われる際に、ファイルの作成時からこの秒数以上経過しているファイルが削除されます。未指定の場合の規定値は86,400秒(24時間)です。
これは、個々のキャッシュで指定した有効期間とは無関係に処理される点に注意してください。つまり、この秒数より長い有効期間が設定されているキャッシュは、有効期間中にも関わらずそのファイルが削除されてしまう可能性があります。
- gc_divisor
-
キャッシュファイルの削除処理は、コンストラクタの実行時に一定の確率で行われますが、その確率の分母です(分子は1です)。未指定の場合の規定値は100で、つまり、削除処理は1/100の確率で行われます。
HTMLScraping->getXmlObject()
class HTMLScraping {
SimpleXMLElement getXmlObject ( string $url [, integer $cache_lifetime [, boolean $conditional_request [, array $headers [, array $post]]]] )
}
指定のURLで取得したHTMLドキュメントから生成したSimpleXMLオブジェクトを返します。エラー発生時には例外をスローします。
パラメータ
- url
-
HTMLドキュメントの完全なHTTP URL。
- cache_lifetime
-
URLのレスポンスをここで指定した秒数間キャッシュします。コンストラクタのパラメータで、有効なキャッシュファイルの保存先ディレクトリ名が指定されていない場合、この指定は無視され、キャッシュされません。
- conditional_request
-
TRUEの場合、URLのレスポンスにLast-Modified/Etagヘッダが含まれていた場合は、キャッシュの有効期間中でもIf-Modified-Since/If- None-Matchによる条件付きリクエストを行いキャッシュの更新を試みます。未指定の場合の規定値はFALSEです。
- headers
-
URLにリクエストする際のHTTPヘッダを、「ヘッダ名 => 値」形式の連想配列で指定します。例えば任意のUser-Agent値などを指定したい場合や、あるいはBasic認証で保護されたURLへのリクエストを行う場合などには、これを指定してください。
キャッシュを利用する場合、キャッシュを紐付けるIDには、URLに加えてこの値も利用される点に注意してください。つまり、同じURLへのリクエストでも、この値が異なる場合はキャッシュも異なります。
POSTメソッドでのリクエストを行う場合、POSTデータを「キー名 => 値」形式の連想配列で指定します。
キャッシュを利用する場合、キャッシュを紐付けるIDには、URLに加えてこの値も利用される点に注意してください。つまり、同じURLへのリクエストでも、この値が異なる場合はキャッシュも異なります。
例
以下の例では、URLのレスポンスを3,600秒(1時間)キャッシュします(キャッシュファイルは/tmp/に保存されます)。ただし、レスポンスにLast-Modified/Etagヘッダが含まれていた場合は、キャッシュ期間中でも常にIf-Modified-Since/If- None-Matchによる条件付きリクエストが行われます。
$s = new HTMLScraping('/tmp/'); $xml = $s->getXmlObject('http://www.example.org/', 3600, true);
以下の例では、POSTメソッドによるリクエストが行われます。リクエストのUser-Agentは「Hogebot/1.0」です。また、リクエストにはBasic認証のユーザ名とパスワードが付与されます。
$headers = array( 'user-agent' => 'Hogebot/1.0', 'authorization' => 'Basic '.base64_encode('hoge:hoge1234') ); $post = array( 'mail' => 'sage', 'message' => 'ほげなす' ); $s = new HTMLScraping; $xml = $s->getXmlObject('http://www.example.org/', 0, false, $headers, $post);
HTMLScraping->getXhtml()
class HTMLScraping {
array getXhtml ( string $url [, integer $cache_lifetime [, boolean $conditional_request [, array $headers [, array $post]]]] )
}
返り値がSimpleXMLオブジェクトではなく、以下の要素を持つ連想配列であること以外は、HTMLScraping->getXmlObject()と同じです。SimpleXMLを使用しないで、例えばDOMなどに直接読み込みたい場合は、こちらを利用してください。
- url
リダイレクト後の最終的なURL。
- code
最終的なHTTPステータスコード。ただし200以外では、304を除き例外をスローし、304ではキャッシュを使用するため、この値は常に200です。
- headers
レスポンスのHTTPヘッダを格納した連想配列。
- body
整形式に変換済みの、レスポンスのエンティティボディ。なお、HTTPヘッダやMETA要素などの値に関わらず、文字エンコーディングはUTF-8に変換されている点に注意してください。
HTMLScraping->convertPath()
class HTMLScraping {
void convertPath ( SimpleXMLElement $xml_object , array $tags [, string $base_url] )
}
SimpleXMLオブジェクトの指定の要素の属性値を、完全なHTTP URLに変換します。
パラメータ
- xml_object
-
SimpleXMLオブジェクト。
- tags
-
変換対象を「要素名 => 属性名」形式の連想配列で指定します。
変換の基準となるURLを指定します。HTMLScraping->getXmlObject()で作成したSimpleXMLオブジェクトでは、作成時にBASE要素が追加されており、これが未指定の場合、そのHREF属性値が基準のURLとなります。
例
以下の例では、A要素のHREF属性値とIMG要素のSRC属性値が変換されます。
$tags = array( 'a' => 'href', 'img' => 'src' ); $s = new HTMLScraping; $xml = $s->getXmlObject('http://www.example.org/'); $s->convertPath($xml, $tags);
HTMLScraping->dumpElement()
class HTMLScraping {
string dumpElement ( SimpleXMLElement $element )
}
実体参照についてをご覧ください。
HTMLScraping->emulateLastModified()
class HTMLScraping {
void emulateLastModified ( string $cache_id , integer $cache_lifetime )
}
準備中。
HTTP_Requestについての補足
HTTP_Requestはリクエスト内容のクエリーストリング部分を、Net_URL->getQueryString()を使用して生成します。これは元々のURLのクエリーストリングを、いったん連想配列に格納した上で再構築するものですが、そのためリクエスト内容は必ずしも元々のURLの通りではなく、サイトによっては正しく受け入れられない場合があります。この、既知の事例には以下のようなものがあります。
- クエリーのキーワードを意図的に重複させている場合(例:Googleマップ)
- クエリーストリングがURLエンコードされていることが期待されない場合(例:yahoo.co.jpのリダイレクト)
HTTP_Request->_buildRequest()中で$querystring変数を設定している箇所を以下のように改変することで、元々のURLのままのクエリーストリングでリクエストが行われるようになります。
function _buildRequest() { $separator = ini_get('arg_separator.output'); ini_set('arg_separator.output', '&'); /* BEGIN MODIFIED */ // $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; $array = parse_url($this->_url->url); $querystring = isset($array['query']) ? '?' . $array['query'] : ''; /* END MODIFIED */ ini_set('arg_separator.output', $separator); ...
0 コメント:
コメントを投稿