実際、PHP5 以降、PHP は XML 関連の操作を解析および生成するための強力なクラスを提供しています。 . 、これが今日説明する DOMDocument クラスです。ただし、ほとんどの人は、Web ページをクロールするときに Web コンテンツを解析するために正規表現を使用したいと考えていると思います。今日このクラスを学習した後は、次回は PHP 独自の解析方法を使用して解析と分析を試してみることができます。
HTML の解析
// 解析 HTML $baidu = file_get_contents('https://www.baidu.com'); $doc = new DOMDocument(); @$doc->loadHTML($baidu); // 百度输出框 $inputSearch = $doc->getElementById('kw'); var_dump($inputSearch); // object(DOMElement)#2 // .... echo $inputSearch->getAttribute('name'), PHP_EOL; // wd // 获取所有图片的链接 $allImageLinks = []; $imgs = $doc->getElementsByTagName('img'); foreach($imgs as $img){ $allImageLinks[] = $img->getAttribute('src'); } print_r($allImageLinks); // Array // ( // [0] => //www.baidu.com/img/baidu_jgylogo3.gif // [1] => //www.baidu.com/img/bd_logo.png // [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif // ) // 利用 parse_url 分析链接 foreach($allImageLinks as $link){ print_r(parse_url($link)); } // Array // ( // [host] => www.baidu.com // [path] => /img/baidu_jgylogo3.gif // ) // Array // ( // [host] => www.baidu.com // [path] => /img/bd_logo.png // ) // Array // ( // [scheme] => http // [host] => s1.bdstatic.com // [path] => /r/www/cache/static/global/img/gs_237f015b.gif // )
とても明確でオブジェクト指向だと思いませんか?データベース操作に初めて ORM ライブラリを使用したような感じです。一つ一つ見ていきましょう。
$baidu = file_get_contents('https://www.baidu.com'); $doc = new DOMDocument(); @$doc->loadHTML($baidu);
最初は、ドキュメントのコンテンツをロードすることです。これは理解しやすいです。loadHTML() メソッドを使用して、HTML コンテンツを直接ロードします。また、他のいくつかのメソッドも提供します。load() はファイルから XML をロードし、loadXML() は文字列から XML をロードし、loadHTMLFile() はファイルから HTML をロードします。
// 百度输出框 $inputSearch = $doc->getElementById('kw'); var_dump($inputSearch); // object(DOMElement)#2 // .... echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
次に、フロントエンド JS と同じ DOM 操作 API を使用して、HTML 内の要素を操作します。この例では、Baidu のテキスト ボックスを取得し、getElementById() メソッドを直接使用して、指定されたコンテンツとして ID を持つ DOMElement オブジェクトを取得します。その後、その値、属性などを取得できます。
[関連する推奨事項: PHP ビデオ チュートリアル ]
// 获取所有图片的链接 $allImageLinks = []; $imgs = $doc->getElementsByTagName('img'); foreach($imgs as $img){ $allImageLinks[] = $img->getAttribute('src'); } print_r($allImageLinks); // Array // ( // [0] => //www.baidu.com/img/baidu_jgylogo3.gif // [1] => //www.baidu.com/img/bd_logo.png // [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif // ) // 利用 parse_url 分析链接 foreach($allImageLinks as $link){ print_r(parse_url($link)); } // Array // ( // [host] => www.baidu.com // [path] => /img/baidu_jgylogo3.gif // ) // Array // ( // [host] => www.baidu.com // [path] => /img/bd_logo.png // ) // Array // ( // [scheme] => http // [host] => s1.bdstatic.com // [path] => /r/www/cache/static/global/img/gs_237f015b.gif // )
この例では、HTML ドキュメント内のすべての画像リンクを取得します。正規表現に比べて非常に便利で、コード自体が一目瞭然なので、正規の一致の失敗の問題を考慮する必要がありません。 PHP に付属する別の parse_url() メソッドと連携すると、リンクを非常に簡単に分析し、必要なコンテンツを抽出することもできます。
XML の解析は HTML の解析と似ており、どちらも DOMDocument および DOMElement によって提供されるメソッド インターフェイスを使用して簡単に解析できます。では、XML の標準形式を生成するにはどうすればよいでしょうか?もちろん、これも非常に簡単で、文字列を結合する必要がなく、このクラスを使用してオブジェクトベースの操作を実行できます。
XML の生成
// 生成一个XML文档 $xml = new DOMDocument('1.0', 'UTF-8'); $node1 = $xml->createElement('First', 'This is First Node.'); $node1->setAttribute('type', '1'); $node2 = $xml->createElement('Second'); $node2->setAttribute('type', '2'); $node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.'); $node2->appendChild($node2_child); $xml->appendChild($node1); $xml->appendChild($node2); print $xml->saveXML(); /* <?xml version="1.0" encoding="UTF-8"?> <First type="1">This is First Node.</First> <Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second> */
実際、フロントエンド JS の基礎を少しでも持っている限り、このコードの意味を理解するのは難しくありません。 createElement() メソッドを使用して DOMElement オブジェクトを作成し、それにプロパティとコンテンツを追加します。 appendChild() メソッドを使用して、下位ノードを現在の DOMElement または DOMDocument に追加します。最後に、saveXML() を使用して標準 XML 形式のコンテンツを生成します。
概要
上記の 2 つの簡単な例を通して、この DOMDocument が XML クラス ファイルの解析を行う方法にすでに誰もが非常に興味を持っていると思います。ただし、通常の解析方法と比較してパフォーマンスがどのように異なるかに関する適切なテストはありません。ただし、通常の状況では、Web サイトの HMTL ドキュメントはそれほど大きくはなりません。結局、各 Web サイトは独自の読み込み速度も考慮することになります。ドキュメントが非常に大きい場合、ユーザー エクスペリエンスが低下するため、基本的に、この一連のインターフェイスを日常のクローラー分析と処理に使用しても問題ありません。
テストコード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php
参考ドキュメント:
https://www.php.net/manual/zh/class.domdocument.php