まったり技術ブログ

Webエンジニアのセキュリティブログ

【PHP】『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
    オブジェクトを生成するためにはリクエスト通信を発生させないといけなさそう。
<?php
$client = new Client();
$crawler = $client->request('GET', 'https://www.symfony.com/blog/');
// 通信で取得したオブジェクトが解析対象になる

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

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

ja.stackoverflow.com

 下記のコードで通信を発生せずに引数に与えた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!