まったり技術ブログ

Technology is power.

『Goutte』を使って文字列からHTML解析

“通信を発生させずにHTMLを解析"をしたい・・・

 今までPHPでHTML解析するときは「Simple HTML DOM Parser」を利用しており、数年ぶりの利用で使い方を確認しているとこのような記事が。

localdisk.hatenablog.com

「Simple HTML DOM Parser」はパフォーマンス面に優れておらず、今では「Goutte」を使った方がいいとか。

github.com

いざ「Goutte」の使い方を簡単に調べてみると「Simple HTML DOM Parser」のようにHTML文字列を引数に与えて解析対象のオブジェクトを作成することができなさそう。 - Simple HTML DOM Parser

// Simple HTML DOM Parserを使った文字列からオブジェクトを生成
$html = str_get_html( '<html><body>Hello!</body></html>' );
  • Goutte
    オブジェクトを生成するためにはリクエスト通信を発生させないといけなさそう。
$client = new Client();
$crawler = $client->request('GET', 'https://www.symfony.com/blog/');
// 通信で取得したオブジェクトが解析対象になる

通信を発生させずにHTMLを解析!!

Goutteでもファイル内に記載されているHTMLを解析できそう。

ja.stackoverflow.com

下記のようにすると、通信を発生せずに引数に与えたHTML文字列を解析することができます。localhost:80に対して、通信を発生させているため、該当のサーバ上で80番ポートをListenさせている必要があります。

<?php
use Goutte\Client;

$client = new Client();
$crawler = $client->request('HEAD', null);
$crawler->clear();

// addHtmlContentの引数にHTML文字列
$crawler->addHtmlContent('<html><body>Hello!</body></html>');

echo $crawler->filter('html')->html();
  //=> <body>Hello!</body>
  
echo $crawler->filter('body')->text();
  //=> Hello!