Rumah > Artikel > hujung hadapan web > Kod PHP untuk menghuraikan HTML menggunakan DiDOM
Dari semasa ke semasa pembangun perlu merangkak halaman web untuk mendapatkan beberapa maklumat daripada tapak web. Sebagai contoh, katakan anda sedang mengusahakan projek peribadi di mana anda perlu mendapatkan maklumat geografi tentang ibu kota negara yang berbeza daripada Wikipedia. Kemasukan manual mengambil banyak masa. Walau bagaimanapun, anda boleh melakukan ini dengan cepat dengan bantuan PHP dengan mengikis halaman Wikipedia. Anda juga boleh menghuraikan HTML secara automatik untuk maklumat tertentu tanpa perlu menyemak imbas keseluruhan markup secara manual.
Dalam tutorial ini, kita akan melihat pada penghurai HTML yang pantas dan mudah digunakan yang dipanggil DiDOM. Kami akan bermula dengan proses pemasangan dan kemudian belajar cara menggunakan pelbagai jenis pemilih (seperti teg, kelas, dll.) untuk mengekstrak maklumat daripada elemen yang berbeza pada halaman web.
Anda boleh memasang DiDOM dengan mudah dalam direktori projek anda dengan menjalankan arahan berikut:
composer require imangazaliev/didom
Selepas menjalankan arahan di atas, anda akan dapat memuatkan HTML daripada rentetan, fail tempatan atau halaman web. Berikut ialah contoh:
require_once('vendor/autoload.php'); use DiDom\Document; $document = new Document($washington_dc_html_string); $document = new Document('washington_dc.html', true); $url = 'https://en.wikipedia.org/wiki/Washington,_D.C.'; $document = new Document($url, true);
Apabila anda memutuskan untuk menghuraikan HTML daripada dokumen, ia mungkin telah dimuatkan dan disimpan dalam pembolehubah. Dalam kes ini, anda hanya menghantar pembolehubah kepada Document()
dan DiDOM akan menyediakan rentetan untuk dihuraikan. Document()
,DiDOM 将准备要解析的字符串。
如果必须从文件或 URL 加载 HTML,您可以将其作为第一个参数传递给 Document()
并将第二个参数设置为 true
。
您还可以使用不带任何参数的 new Document()
创建一个新的 Document
对象。在这种情况下,您可以调用方法 loadHtml()
从字符串加载 HTML,并调用 loadHtmlFile()
从文件或网页加载 HTML。
从元素获取 HTML 或文本之前要做的第一件事是找到元素本身。最简单的方法是使用 find()
方法并将所需元素的 CSS 选择器作为第一个参数传递。
您还可以将元素的 XPath 作为 find()
方法的第一个参数传递。但是,这需要您传递 Query::TYPE_XPATH
作为第二个参数。
如果您只想使用 XPath 值来查找 HTML 元素,则可以简单地使用 xpath()
方法,而不是传递 Query::TYPE_XPATH
每次作为 find()
的第二个参数。
如果 DiDOM 可以找到与传递的 CSS 选择器或 XPATH 表达式匹配的元素,它将返回 DiDomElement
实例的数组。如果没有找到这样的元素,它将返回一个空数组。
由于这些方法返回一个数组,因此您可以使用 find()[n-1]
直接访问第 n 个匹配元素。
在下面的示例中,我们将从有关华盛顿特区的维基百科文章中的所有一级和二级标题中获取内部 HTML
require_once('vendor/autoload.php'); use DiDom\Document; $document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true); $main_heading = $document->find('h1.firstHeading')[0]; echo $main_heading->html(); $sub_headings = $document->find('h2'); foreach($sub_headings as $sub_heading) { if($sub_heading->text() !== 'See also') { echo $sub_heading->html(); } else { break; } }
我们首先通过传递有关华盛顿特区的维基百科文章的 URL 来创建一个新的 Document 对象。之后,我们使用 find()
方法获取主标题元素并将其存储在名为 $main_heading
的变量内。我们现在可以在此元素上调用不同的方法,例如 text()
、innerHtml()
、html()
等
对于主标题,我们只需调用 html()
方法即可返回整个标题元素的 HTML。同样,我们可以使用 innerHtml()
方法获取特定元素内的 HTML。有时,您会对元素的纯文本内容而不是其 HTML 更感兴趣。在这种情况下,您只需使用 text()
方法即可完成。
二级标题将我们的维基百科页面划分为定义明确的部分。但是,您可能希望删除其中一些副标题,例如“另请参阅”、“注释”等。
一种方法是循环遍历所有二级标题并检查 text()
方法返回的值。如果返回的标题文本是“另请参阅”,我们将跳出循环。
使用 $document->find('h2')[3]
和 $document- 可以直接到达第四或第六级二级标题>find('h2')[5]
分别。
一旦您可以访问特定元素,该库就可以让您上下遍历 DOM 树以轻松访问其他元素。
您可以使用 parent()
方法转到 HTML 元素的父元素。同样,您可以使用 nextSibling()
和 previousSibling()
Document()
dan tetapkan parameter kedua kepada benar
. #🎜🎜#
#🎜🎜#Anda juga boleh mencipta objek Document
baharu menggunakan new Document()
tanpa sebarang parameter. Dalam kes ini, anda boleh memanggil kaedah loadHtml()
untuk memuatkan HTML daripada rentetan dan loadHtmlFile()
daripada fail Atau halaman web memuatkan HTML.
#🎜🎜#Cari elemen HTML#🎜🎜#
#🎜🎜#Perkara pertama yang perlu dilakukan sebelum mendapatkan HTML atau teks daripada elemen ialah mencari elemen itu sendiri. Cara paling mudah ialah menggunakan kaedah find()
dan lulus pemilih CSS bagi elemen yang dikehendaki sebagai hujah pertama. #🎜🎜#
#🎜🎜#Anda juga boleh menghantar XPath elemen sebagai argumen pertama kepada kaedah find()
. Walau bagaimanapun, ini memerlukan anda untuk menghantar Query::TYPE_XPATH
sebagai parameter kedua. #🎜🎜#
#🎜🎜#Jika anda hanya mahu menggunakan nilai XPath untuk mencari elemen HTML, anda hanya boleh menggunakan kaedah xpath()
dan bukannya menghantar Pertanyaan ::TYPE_XPATH
setiap kali sebagai parameter kedua find()
. #🎜🎜#
#🎜🎜#Jika DiDOM boleh menemui elemen yang sepadan dengan pemilih CSS yang diluluskan atau ungkapan XPATH, ia akan mengembalikan tatasusunan contoh DiDomElement
. Jika tiada unsur tersebut ditemui, ia mengembalikan tatasusunan kosong. #🎜🎜#
#🎜🎜#Memandangkan kaedah ini mengembalikan tatasusunan, anda boleh menggunakan find()[n-1]
untuk mengakses terus elemen padanan ke-n. #🎜🎜#
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()."<br>"; } else { break; } }#🎜🎜#Kami mula-mula mencipta objek Dokumen baharu dengan menghantar URL artikel Wikipedia tentang Washington, DC. Selepas itu, kami menggunakan kaedah
find()
untuk mendapatkan elemen tajuk utama dan menyimpannya di dalam pembolehubah yang dipanggil $main_heading
. Kini kita boleh memanggil kaedah yang berbeza pada elemen ini seperti text()
, innerHtml()
, html()
dll#🎜🎜#
#🎜🎜#Untuk tajuk utama, kami hanya memanggil kaedah html()
untuk mengembalikan HTML keseluruhan elemen tajuk. Begitu juga, kita boleh mendapatkan HTML di dalam elemen tertentu menggunakan kaedah innerHtml()
. Kadangkala anda lebih berminat dengan kandungan teks biasa elemen berbanding HTMLnya. Dalam kes ini, anda hanya boleh menggunakan kaedah text()
. #🎜🎜#
#🎜🎜# Tajuk sekunder membahagikan halaman Wikipedia kami kepada bahagian yang jelas. Walau bagaimanapun, anda mungkin ingin mengalih keluar beberapa subtajuk ini, seperti "Lihat Juga", "Nota," dsb. #🎜🎜#
#🎜🎜#Salah satu cara ialah dengan mengulangi semua tajuk sekunder dan menyemak nilai yang dikembalikan oleh kaedah text()
. Jika teks tajuk yang dikembalikan ialah "Lihat Juga" kami akan keluar dari gelung. #🎜🎜#
#🎜🎜#Gunakan $document->find('h2')[3]
dan $document- untuk terus mencapai keempat atau keempat Tajuk menengah enam peringkat>cari('h2')[5]
masing-masing. #🎜🎜#
#🎜🎜#Lintas DOM ke atas dan ke bawah#🎜🎜#
#🎜🎜#Setelah anda mempunyai akses kepada elemen tertentu, pustaka membolehkan anda melintasi atas dan ke bawah pokok DOM untuk mengakses elemen lain dengan mudah. #🎜🎜#
#🎜🎜#Anda boleh menggunakan kaedah parent()
untuk pergi ke elemen induk bagi elemen HTML. Begitu juga, anda boleh mendapatkan adik beradik seterusnya atau sebelumnya bagi elemen menggunakan kaedah nextSibling()
dan 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()."<br>"; } 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."<br>"; }
一旦您有权访问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 文档中添加、删除和替换元素。
如果您希望我在教程中澄清任何内容,请随时在评论中告诉我。
Atas ialah kandungan terperinci Kod PHP untuk menghuraikan HTML menggunakan DiDOM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!