はじめに
「"通信を発生させずにHTMLを解析"をしたい・・・」という要望があったので執筆。
今までPHPでHTML解析するときは「Simple HTML DOM Parser」を利用しており、数年ぶりの利用で使い方を確認していると下記のような記事がありました。
localdisk.hatenablog.com
「Simple HTML DOM Parser」はパフォーマンス面に優れておらず、今では「Goutte」を使った方がいいとか。
いざ「Goutte」の使い方を簡単に調べてみると「Simple HTML DOM Parser」のようにHTML文字列を引数に与えて解析対象のオブジェクトを作成することができなさそう。
- Simple HTML DOM Parser
// Simple HTML DOM Parserを使った文字列からオブジェクトを生成 $html = str_get_html( '<html><body>Hello!</body></html>' );
- Goutte
オブジェクトを生成するためにはリクエスト通信を発生させないといけなさそう。
<?php $client = new Client(); $crawler = $client->request('GET', 'https://www.symfony.com/blog/'); // 通信で取得したオブジェクトが解析対象になる
通信を発生させずにHTMLを解析
Goutteでもファイル内に記載されているHTMLを解析できそう。
下記のコードで通信を発生せずに引数に与えたHTML文字列を解析することができます。
<?php use Symfony\Component\DomCrawler\Crawler; $crawler = new Crawler(null); // addHtmlContentの引数にHTML文字列 $crawler->addHtmlContent('<html><body>Hello!</body></html>'); echo $crawler->filter('html')->html(); //=> <body>Hello!</body> echo $crawler->filter('body')->text(); //=> Hello!