DiDOM を使用して HTML を解析するための PHP コード

WBOY
リリース: 2023-09-08 11:41:13
オリジナル
855 人が閲覧しました

DiDOM を使用して HTML を解析するための PHP コード

開発者は、Web ページをクロールして Web サイトから情報を取得する必要がある場合があります。たとえば、Wikipedia からさまざまな国の首都に関する地理情報を取得する必要がある個人プロジェクトに取り組んでいるとします。手入力だとかなり時間がかかります。ただし、PHP を使用して Wikipedia ページをスクレイピングすることで、これを非常に迅速に行うことができます。また、マークアップ全体を手動で参照することなく、HTML を自動的に解析して特定の情報を取得することもできます。

このチュートリアルでは、DiDOM と呼ばれる高速で使いやすい HTML パーサーを見ていきます。まずインストールプロセスから始めて、さまざまなタイプのセレクター (タグ、クラスなど) を使用して Web ページ上のさまざまな要素から情報を抽出する方法を学びます。

インストールと使用方法

次のコマンドを実行すると、プロジェクト ディレクトリに DiDOM を簡単にインストールできます:

リーリー

上記のコマンドを実行すると、文字列、ローカル ファイル、または Web ページから HTML をロードできるようになります。以下に例を示します:

リーリー

ドキュメントから HTML を解析することにしたとき、HTML はすでにロードされ、変数に保存されている可能性があります。この場合、その変数をDocument()に渡すだけで、DiDOM が解析する文字列を準備します。

HTML をファイルまたは URL からロードする必要がある場合は、それを最初の引数としてDocument()に渡し、2 番目の引数をtrueに設定します。

パラメータを指定せずにnew Document()を使用して、新しいDocumentオブジェクトを作成することもできます。この場合、メソッドloadHtml()を呼び出して文字列から HTML をロードし、loadHtmlFile()を呼び出してファイルまたは Web ページから HTML をロードできます。

HTML要素の検索

要素から HTML またはテキストを取得する前に最初に行うことは、要素自体を見つけることです。最も簡単な方法は、find()メソッドを使用し、目的の要素の CSS セレクターを最初の引数として渡すことです。

要素の XPath を最初の引数としてfind()メソッドに渡すこともできます。ただし、これにはQuery::TYPE_XPATHを 2 番目のパラメータとして渡す必要があります。

XPath 値を使用して HTML 要素を検索したい場合は、毎回Query::TYPE_XPATHを # として渡す代わりに、単純にxpath()メソッドを使用できます。 ## find()の 2 番目のパラメータ。

DiDOM は、渡された CSS セレクターまたは XPATH 式に一致する要素を見つけることができた場合、

DiDom\Elementインスタンスの配列を返します。そのような要素が見つからない場合は、空の配列を返します。

これらのメソッドは配列を返すため、

find()[n-1]を使用して、n 番目に一致する要素に直接アクセスできます。

一例

以下の例では、ワシントン DC に関する Wikipedia の記事の第 1 レベルと第 2 レベルの見出しすべてから内部 HTML を取得します。 リーリー

最初に、ワシントン DC に関する Wikipedia 記事の URL を渡して、新しい Document オブジェクトを作成します。その後、

find()

メソッドを使用してメインの見出し要素を取得し、それを$main_Headingという名前の変数内に保存します。この要素で、text()innerHtml()html()etcなどのさまざまなメソッドを呼び出すことができるようになりました。メイン タイトルの場合は、単純に

html()

メソッドを呼び出して、タイトル要素全体の HTML を返します。同様に、innerHtml()メソッドを使用して、特定の要素内の HTML を取得できます。場合によっては、要素の HTML よりもプレーン テキスト コンテンツに興味がある場合があります。この場合、text()メソッドを使用するだけです。副見出しは、Wikipedia ページを明確に定義されたセクションに分割します。ただし、「関連項目」や「メモ」などの小見出しの一部を削除することもできます。

1 つの方法は、すべての二次見出しをループし、

text()

メソッドによって返される値を確認することです。返されたタイトル テキストが「関連項目」の場合、ループから抜け出します。#$document->find('h2')[3]

$document- を使用して、第 4 レベルまたは第 6 レベルの二次タイトル>find('h2' )[5 ]### それぞれ。DOM を上下にトラバースする特定の要素にアクセスできるようになると、ライブラリを使用して DOM ツリーを上下に移動して、他の要素に簡単にアクセスできるようになります。

parent()

メソッドを使用すると、HTML 要素の親要素に移動できます。同様に、

nextSibling()

メソッドとpreviousSibling()メソッドを使用して、要素の次または前の兄弟を取得できます。

还有很多方法可用于访问 DOM 元素的子元素。例如,您可以使用 child(n)方法获取特定的子元素。同样,您可以使用firstChild()lastChild()方法访问特定元素的第一个或最后一个子元素。您可以使用children()方法循环遍历特定 DOM 元素的所有子元素。

一旦到达特定元素,您将能够使用html()innerHtml()text()方法。

在下面的示例中,我们从二级标题元素开始,并继续检查下一个同级元素是否包含一些文本。一旦我们找到带有一些文本的同级元素,我们就会将其输出到浏览器。

require_once('vendor/autoload.php'); use DiDom\Document; $document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $sub_headings = $document->find('h2'); for($i = 1; $i < count($sub_headings); $i++) { if($sub_headings[$i]->text() !== 'See also') { $next_sibling = $sub_headings[$i]->nextSibling(); while(!$next_elem->html()) { $next_sibling = $next_sibling->nextSibling(); } echo $next_elem->html()."
"; } else { break; } }
ログイン後にコピー

您可以使用类似的技术循环遍历所有同级元素,并且仅在文本包含特定字符串或同级元素是段落标记等时输出文本。一旦您了解了基础知识,找到正确的信息就是简单的。

操作元素属性

在某些情况下,获取或设置不同元素的属性值的能力非常有用。例如,我们可以使用$image_elem->attr( 'src').以类似的方式,您可以获得文档中所有a标记的href属性的值。

可以通过三种方法获取 HTML 元素的给定属性的值。您可以使用getAttribute('attrName')方法并将您感兴趣的属性名称作为参数传递。您还可以使用 attr('attrName')方法,其工作方式与 getAttribute()类似。最后,该库还允许您使用$elem->attrName直接获取属性值。这意味着您可以使用$imageElem->src直接获取图像元素的src属性值。

require_once('vendor/autoload.php'); use DiDom\Document; $document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $images = $document->find('img'); foreach($images as $image) { echo $image->src."
"; }
ログイン後にコピー

一旦您有权访问src属性,您就可以编写代码来自动下载所有图像文件。这样,您将能够节省大量时间。

您还可以使用三种不同的技术来设置给定属性的值。首先,您可以使用 setAttribute('attrName', 'attrValue')方法来设置属性值。您还可以使用 attr('attrName', 'attrValue')方法来设置属性值。最后,您可以使用$Elem->attrName = 'attrValue'设置给定元素的属性值。

添加、删除和替换元素

您还可以使用库提供的不同方法对加载的 HTML 文档进行更改。例如,您可以使用appendChild()replace()从 DOM 树添加、替换或删除元素">删除()方法。

该库还允许您创建自己的 HTML 元素,以便将它们附加到原始 HTML 文档中。您可以使用new Element('tagName', 'tagContent')创建新的 Element 对象。

请记住,如果您的程序在实例化之前不包含行use DiDom\Element,您将收到未捕获错误:未找到“Element”类错误元素对象。

获得该元素后,您可以使用appendChild()方法将其附加到 DOM 中的其他元素,也可以使用replace( )方法使用新实例化的元素来替换文档中某些旧的 HTML 元素。下面的例子应该有助于进一步阐明这个概念。

require_once('vendor/autoload.php'); use DiDom\Document; use DiDom\Element; $document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true); // This will result in error. echo $document->find('h2.test-heading')[0]->html()."\n"; $test_heading = new Element('h2', 'This is test heading.'); $test_heading->class = 'test-heading'; $document->find('h1')[0]->replace($test_heading); echo $document->find('h2.test-heading')[0]->html()."\n";
ログイン後にコピー

最初,我们的文档中没有test-heading类的h2元素。因此,如果我们尝试访问这样的元素,我们将不断收到错误。

验证不存在这样的元素后,我们创建一个新的h2元素,并将其class属性的值更改为test-heading>.

之后,我们将文档中的第一个h1元素替换为新创建的h2元素。再次在我们的文档中使用find()方法查找带有test-heading类的h2标题,现在将返回一个元素。

最终想法

本教程介绍了 PHP DiDOM HTML 解析器的基础知识。我们从安装开始,然后学习如何从字符串、文件或 URL 加载 HTML。之后,我们讨论了如何根据 CSS 选择器或 XPath 查找特定元素。我们还学习了如何获取元素的兄弟元素、父元素或子元素。其余部分介绍了如何操作特定元素的属性或在 HTML 文档中添加、删除和替换元素。

如果您希望我在教程中澄清任何内容,请随时在评论中告诉我。

以上がDiDOM を使用して HTML を解析するための PHP コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!