[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
質問
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アーキテクトおよび著者の関係者ではありません。
関連
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] CSSでcellpaddingとcellspacingを設定する?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] リンクのように動作するHTMLボタンを作成する方法
-
[解決済み] HTML 5: Is it <br>, <br/>, or <br />?
-
[解決済み] XMLを解析して、特定のノード属性のインスタンスをカウントするには?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】空の配列要素を削除する
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。
-
[解決済み] phpを使ってhtmlからimg src、title、altを抽出するには?[重複しています]。
-
[解決済み] PHPに最適なXMLパーサー [重複]。