1. ホーム
  2. php

[解決済み] PHPでHTML/XMLをパースして処理する方法とは?

2022-03-14 05:27:33

質問

HTML/XMLを解析して情報を取り出すにはどうしたらよいのでしょうか?

どのように解決するの?

ネイティブXML拡張機能

のいずれかを使用することをお勧めします。 ネイティブXML拡張機能 これらはPHPにバンドルされており、通常サードパーティのライブラリよりも高速で、マークアップに必要なすべての制御を与えてくれるからです。

DOM

<ブロッククオート

DOM 拡張モジュールを使用すると、PHP 5 で DOM API を使用して XML ドキュメントを操作できるようになります。 これは W3C の Document Object Model Core Level 3 の実装で、 プラットフォームや言語に依存しないインターフェースにより、 プログラムやスクリプトがドキュメントの内容や構造、スタイルに動的にアクセスしたり 更新したりできるようになっています。

DOMは実世界の(壊れた)HTMLを解析し、修正することができ XPathクエリ . をベースにしています。 libxml .

DOM を使って生産的になるには時間がかかりますが、その時間は十分に価値があると思います。DOM は言語に依存しないインタフェースなので、多くの言語で実装を見つけることができます。したがって、プログラミング言語を変更する必要がある場合、その言語の DOM API を使用する方法をすでに知っている可能性があります。

DOMエクステンションの使い方は、これまで 広範囲にカバーされている StackOverflowで検索すれば、ほとんどの問題は解決するはずです。

A 基本的な使用例 および 概念的な概要 は他の回答でご覧ください。

XMLReader

<ブロッククオート

XMLReader 拡張は、XML プルパーサです。リーダはカーソルのようにドキュメントストリームを進み、途中の各ノードで停止するように動作します。

XMLReaderはDOMと同様、libxmlをベースにしています。HTML パーサー モジュールを起動する方法について私は知らないので、壊れた HTML の解析に XMLReader を使用すると、libxml の HTML パーサー モジュールを使用するように明示的に指示できる DOM を使用するよりも堅牢性が低くなる可能性があります。

A 基本的な使用例 は別の回答でご紹介しています。

XMLパーサー

<ブロッククオート

この拡張機能では、XML パーサーを作成し、さまざまな XML イベントに対応するハンドラを定義することができます。各 XML パーサーには、調整可能ないくつかのパラメータもあります。

XML Parser ライブラリも libxml をベースにしたものであり、その実装には SAX 形式のXMLプッシュパーサです。DOM や SimpleXML よりもメモリ管理の面で優れているかもしれませんが、XMLReader で実装されている pull パーサーよりも扱いが難しいでしょう。

シンプルXml

<ブロッククオート

SimpleXML 拡張モジュールは、XML を通常のプロパティセレクタや配列イテレータで処理できるオブジェクトに変換するための、 非常にシンプルで簡単に使用できるツールセットを提供します。

SimpleXMLは、HTMLが有効なXHTMLであることが分かっている場合のオプションです。壊れた HTML をパースする必要がある場合は、SimpleXml を検討する必要はありません。

A 基本的な使用例 が用意されており、その中に PHP マニュアルには、さらに多くの例が掲載されています。 .


サードパーティライブラリ (libxml ベース)

もしサードパーティのライブラリを使いたいのであれば、実際には DOM / libxml を文字列解析の代わりに下に置く。

フルエントドム

<ブロッククオート

FluentDOM は、DOMDocument に対する jQuery ライクな流暢な XML インターフェイスを PHP で提供します。セレクタは XPath あるいは CSS (CSS から XPath への変換ツールを使用) で記述します。現在のバージョンでは、標準的なインターフェイスを実装した DOM を拡張し、DOM Living Standard の機能を追加しています。FluentDOM は、JSON, CSV, JsonML, RabbitFish などの形式を読み込むことができます。Composer 経由でインストールできます。

HtmlPageDom

<ブロッククオート

Wa72\HtmlPageDom は、HTML を簡単に操作するための PHP ライブラリです。 ドキュメントを DOM を使って作成します。そのためには Symfony2 の DomCrawler コンポーネント トラバース を操作するためのメソッドを追加し、拡張しています。 HTML 文書の DOM ツリー。

phpクエリ

<ブロッククオート

phpQuery は、jQuery JavaScript Library をベースにした、サーバサイドで連鎖可能な CSS3 セレクタ駆動の Document Object Model (DOM) API です。 このライブラリはPHP5で書かれており、追加のコマンドラインインターフェース(CLI)を提供します。

これは、"abandonware and buggy: use at your own risk" "と書かれていますが、最小限のメンテナンスはされているようです。

ラミナスドーム

<ブロッククオート

LaminasDomコンポーネント(旧Zend_DOM)は、DOMドキュメントと構造を扱うためのツールを提供します。現在、私たちが提供しているのは Laminas\Dom\Query これは、XPath と CSS セレクタの両方を使用して DOM ドキュメントを照会するための統一されたインターフェイスを提供するものです。

本パッケージは機能的に完全であるとみなされており、現在はセキュリティのみのメンテナンスモードとなっています。

fDOMDocument

<ブロッククオート

fDOMDocument は標準の DOM を拡張し、PHP の警告や通知の代わりに、あらゆるエラーの際に例外を使用するようにしました。また、様々なカスタムメソッドやショートカットを追加し、 DOM の使い方を簡略化することで利便性を高めています。

セイバー/xml

<ブロッククオート

sabre/xmlはXMLReaderとXMLWriterクラスをラップして拡張し、シンプルなquot;xml to object/array" マッピングシステムとデザインパターンを作成するライブラリです。XMLの書き込みと読み込みはシングルパスで行われるため、大きなXMLファイルでも高速かつ低メモリで処理することができます。

FluidXML

<ブロッククオート

FluidXML は、簡潔で流暢な API で XML を操作するための PHP ライブラリです。 XPath と流暢なプログラミングパターンを活用し、楽しく効果的に操作することができます。


サードパーティ製(libxml ベースでないもの)

DOM/libxml をベースに構築することの利点は、ネイティブの拡張をベースにしているため、箱から出しても良いパフォーマンスが得られるということです。しかし、全てのサードパーティ製ライブラリがこの道を歩んでいるわけではありません。以下にそのいくつかを紹介します。

PHP Simple HTML DOM Parser

  • PHP5+で書かれたHTML DOMパーサーは、とても簡単にHTMLを操作することができます!
  • PHP 5+が必要です。
  • 無効なHTMLをサポートします。
  • jQueryのようにセレクタを使用してHTMLページ上のタグを検索します。
  • HTMLから1行で内容を抽出します。

私は一般的にこのパーサーをお勧めしません。コードベースは最悪で、パーサー自体もかなり遅く、メモリを大量に消費します。すべての jQuery セレクタ(たとえば 子セレクタ ) が可能です。libxmlベースのライブラリのいずれかが、これを簡単に上回るはずです。

PHP Html パーサー

<ブロッククオート

PHPHtmlParser はシンプルで柔軟な html パーサーで、jQuery のように任意の css セレクタを使用してタグを選択することができます。目標は、妥当かどうかにかかわらず、htmlを素早く簡単にスクレイピングする方法を必要とするツールの開発を支援することです! このプロジェクトはsunra/php-simple-html-dom-parserによってサポートされていましたが、サポートが停止されたようなので、このプロジェクトは彼の以前の仕事を私が適応させたものです。

繰り返しになりますが、このパーサーはお勧めしません。CPUの使用率が高く、かなり遅いです。また、作成された DOM オブジェクトのメモリをクリアする機能もありません。これらの問題は、特にループを入れ子にした場合に大きくなります。ドキュメント自体も不正確で誤字脱字が多く、16年4月14日以降、修正への対応もありません。


HTML 5

HTML5のパースには上記が使えますが には癖があります。 HTML5が許容するマークアップのためです。そのため、HTML5については、専用のパーサーを使用することを検討した方がよいでしょう。これらは PHP で記述されているため、低レベルの言語でコンパイルされた拡張機能と比較して、パフォーマンスが低下し、メモリ使用量が増えるという問題があることに注意してください。

HTML5DomDocument

<ブロッククオート

HTML5DOMDocument は、ネイティブの DOMDocument ライブラリを拡張します。いくつかのバグが修正され、新しい機能が追加されています。

  • html エンティティを保持する (DOMDocument は保持しない)
  • void タグを保持する(DOMDocument では保持しない)。
  • 正しい部品を正しい場所に移動するHTMLコードの挿入が可能(head要素はhead内に、body要素はbody内に挿入されます)
  • CSS セレクタによる DOM クエリを可能にする(現在利用可能。 * , tagname , tagname#id , #id , tagname.classname , .classname , tagname.classname.classname2 , .classname.classname2 , tagname[attribute-selector] , [attribute-selector] , div, p , div p , div > p , div + p および p ~ ul .)
  • element->classListのサポートを追加しました。
  • 要素->innerHTMLのサポートを追加しました。
  • element->outerHTML のサポートを追加しました。

HTML5

<ブロッククオート

HTML5は、標準に準拠したHTML5パーサーとライターで、すべてPHPで書かれています。安定性が高く、多くのプロダクションサイトで使用されており、500万ダウンロードをはるかに超えています。

HTML5では、以下の機能を提供しています。

<ブロッククオート
  • HTML5シリアライザー
  • PHP の名前空間のサポート
  • コンポーザー対応
  • イベントベース(SAXライク)パーサー
  • DOMツリービルダー
  • QueryPathとの相互運用性
  • PHP 5.3.0 以降で動作します。

正規表現

最後と 最低限必要なもの を使えば、HTMLからデータを抽出することができます。 正規表現 . 一般に、HTML上で正規表現を使用することは推奨されません。

マークアップをマッチングするためのスニペットのほとんどは、ウェブ上で見つけることができますが、もろいものです。ほとんどの場合、それらはHTMLの非常に特定の部分に対してのみ動作します。小さなマークアップの変更、例えばどこかに空白を追加したり、タグの属性を追加したり変更したりすると、正しく書かれていないときに RegEx が失敗することがあります。HTML上でRegExを使う前に、自分が何をしているのか知っておく必要があります。

HTMLパーサーは、すでにHTMLの構文規則を知っています。正規表現は新しくRegExを書くたびに教えなければなりません。RegExはいくつかのケースでは問題ありませんが、それは本当にあなたのユースケースに依存します。

あなた より信頼性の高いパーサーを書くことができる を書くことで、より効果的になります。 完全で信頼性の高い 正規表現を使ったカスタムパーサーは、前述のライブラリがすでに存在し、この点ではずっと良い仕事をしてくれるのに、時間の無駄です。

以下もご参照ください。 クトゥルフの方法でHtmlを解析する


書籍紹介

お金をかけたい人は、以下をご覧ください。

私はPHPアーキテクトおよび著者の関係者ではありません。