使用DiDOM解析HTML的PHP代码

使用didom解析html的php代码

开发人员时不时地需要抓取网页以从网站获取一些信息。例如,假设您正在开发一个个人项目,您必须从维基百科获取有关不同国家首都的地理信息。手动输入会花费很多时间。不过,您可以借助 PHP 抓取维基百科页面,非常快速地完成此操作。您还可以自动解析 HTML 以获取特定信息,而无需手动浏览整个标记。

在本教程中,我们将了解一种名为 DiDOM 的快速且易于使用的 HTML 解析器。我们将从安装过程开始,然后学习如何使用不同类型的选择器(如标签、类等)从网页上的不同元素中提取信息。

安装与使用

您可以通过运行以下命令轻松在项目目录中安装 DiDOM:

composer require imangazaliev/didom

运行上述命令后,您将能够从字符串、本地文件或网页加载 HTML。这是一个例子:

立即学习“PHP免费学习笔记(深入)”;

require_once('vendor/autoload.php');use DiDomDocument;$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);

当您决定从文档中解析 HTML 时,它可能已经被加载并存储在变量中。在这种情况下,您只需将该变量传递给 Document(),DiDOM 将准备要解析的字符串。

如果必须从文件或 URL 加载 HTML,您可以将其作为第一个参数传递给 Document() 并将第二个参数设置为 true

您还可以使用不带任何参数的 new Document() 创建一个新的 Document 对象。在这种情况下,您可以调用方法 loadHtml() 从字符串加载 HTML,并调用 loadHtmlFile() 从文件或网页加载 HTML。

查找 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 DiDomDocument;$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

一旦您可以访问特定元素,该库就可以让您上下遍历 DOM 树以轻松访问其他元素。

您可以使用 parent() 方法转到 HTML 元素的父元素。同样,您可以使用 nextSibling()previousSibling() 方法获取元素的下一个或上一个同级元素。

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

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

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

require_once('vendor/autoload.php');use DiDomDocument;$document = new Document('https://en.wikipedia.org/wiki/Washington,_D.C.', true);$sub_headings = $document->find('h2');for($i = 1; $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 DiDomDocument;$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 DiDomElement ,您将收到未捕获错误:未找到“Element”类错误元素对象。

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

require_once('vendor/autoload.php');use DiDomDocument;use DiDomElement;$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代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551717.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 22:00:59
下一篇 2025年12月18日 10:04:27

相关推荐

  • PHP数组元素访问指南:理解索引与关联数组

    本文详细介绍了PHP中数组元素的访问方法。我们将区分数值索引数组和关联数组,并通过示例代码演示如何根据数组类型使用正确的键(数字索引或字符串键)来高效地存取数组值,并探讨`isset()`函数在不同场景下的应用,帮助开发者避免常见的访问误区。 在PHP编程中,数组是一种非常灵活且强大的数据结构,用于…

    2025年12月13日
    000
  • PHP中protected __construct()的调用限制与扩展解决方案

    本文旨在解决php中尝试调用`protected __construct()`时遇到的错误。文章将深入探讨`protected`访问修饰符对构造函数的限制,并提供一种通过类继承来暴露公共构造函数的实用解决方案。此外,还将讨论构造函数可见性的最佳实践、工厂方法以及依赖注入等替代设计模式,以帮助开发者更…

    2025年12月13日
    000
  • PHP关联数组元素添加与更新指南

    本教程详细讲解了在php中如何正确地向关联数组添加新的键值对。文章通过示例代码演示了直接通过键赋值的方法,并解释了这种方法如何实现元素的添加或更新,避免了常见的错误操作,确保了数组操作的准确性和代码的健壮性。 在PHP编程中,数组是一种非常灵活且强大的数据结构,广泛用于存储和组织数据。特别是关联数组…

    2025年12月12日
    000
  • PHP数组中带键值添加元素的方法

    本文详细介绍了在php中向数组添加带有特定键和值元素的高效方法。通过直接使用键名进行赋值操作,可以精确地将新数据插入到数组中,避免了常见的错误,如覆盖现有数组或产生未定义索引的通知。文章提供了清晰的代码示例和详细解释,帮助读者掌握这一核心操作。 在PHP编程中,数组是一种非常灵活的数据结构,常用于存…

    2025年12月12日
    000
  • 动态构建SQL WHERE子句:避免冗余AND与正确处理初始WHERE关键字

    本文旨在解决动态构建sql查询时,`where`子句可能出现的语法错误,例如生成`where and (condition)`。通过介绍一种健壮的php编程模式,演示如何根据是否存在已有过滤条件,智能地添加`where`关键字和`and`逻辑运算符,从而确保生成的sql查询语法正确且高效。 动态构建…

    2025年12月12日
    000
  • PHP逻辑运算符优先级陷阱:AND/OR与&&/||的行为差异

    本文深入探讨php中`and`/`or`与`&&`/`||`逻辑运算符在行为上的差异,揭示其核心原因在于运算符优先级。通过具体代码示例,我们将详细解析为何在某些情况下它们会产生看似矛盾的结果,并提供最佳实践,帮助开发者避免潜在的逻辑错误,确保代码的准确性和可预测性。 PHP逻辑运算符…

    2025年12月12日
    000
  • 使用PHP和MySQL通过自连接查询显示层级分类数据

    本文详细介绍了如何利用mysql数据库的自连接(self-join)技术,结合php编程语言,从单一的分类表中高效地提取并展示具有父子层级关系的数据。教程将涵盖sql查询的构建,特别是left join的应用,以及如何在php中处理查询结果,最终生成一个结构清晰、包含子类别及其对应父类别信息的htm…

    2025年12月12日
    000
  • PHP中if条件判断失效的原因及解决方案

    本文旨在帮助开发者理解PHP中 `if` 条件判断失效的常见原因,并提供相应的解决方案。通过一个实际的代码示例,详细解释了由于赋值运算符误用导致条件判断错误的情况,并给出了正确的比较运算符用法。掌握这些知识点,可以有效避免类似错误,提高代码的健壮性。 在PHP编程中,if 语句是控制流程的关键组成部…

    2025年12月12日
    000
  • PHP条件判断深度解析:避免赋值运算符引发的逻辑陷阱

    本文深入探讨php条件判断中一个常见的逻辑错误:将赋值运算符`=`误用于相等比较,导致条件始终为真或为假,从而使预期逻辑失效。教程将详细解释赋值与比较运算符的区别,并通过代码示例展示如何正确使用`==`或`===`进行条件判断,同时介绍“yoda条件”等最佳实践,帮助开发者避免此类程序行为异常。 在…

    2025年12月12日
    000
  • php编写基础语法入门指南_php编写代码的十大核心要点解析

    掌握PHP基础语法是编程第一步,需理解变量声明(如$name = “John”)、数据类型、常量定义(define(“SITE_NAME”, “MyWebsite”))、控制结构(if/else、switch)、循环(for、w…

    2025年12月12日
    000
  • php怎么用的_PHP基础语法与实际开发应用综合方法

    掌握PHP开发需先理解语法结构,确保代码被正确解析;接着熟悉变量与数据类型声明,提升程序健壮性;灵活运用控制结构实现动态逻辑;通过函数封装提高代码复用性;正确处理表单数据并使用超全局变量实现用户交互;最后合理组织代码结构,便于项目维护与团队协作。 如果您在学习PHP编程时遇到困难,不知道如何正确使用…

    2025年12月12日
    000
  • PHP教程:在数组中将特定字符串替换为另一个完整数组

    本教程详细讲解如何在php中将数组内的特定字符串值替换为一个完整的子数组。通过使用`foreach`循环结合引用传递,可以直接修改原始数组元素,从而实现将单个标量值替换为嵌套数组结构的操作,并分析其实现原理和注意事项。 在PHP编程中,数组是核心数据结构之一,对数组元素的增删改查是日常开发中常见的操…

    2025年12月12日
    000
  • PHP中将数组特定值替换为另一个完整数组的教程

    本教程详细介绍了如何在PHP中,通过遍历主数组并利用引用(`&`)机制,将数组中特定的标量值(例如字符串’Other’)替换为另一个完整的数组。文章通过清晰的代码示例,演示了如何实现这种替换,并强调了使用引用的重要性,以确保直接修改原始数组的元素。 引言:理解数组替换…

    2025年12月12日
    000
  • php语法怎么用_PHP基础语法(变量/函数/循环)使用方法

    掌握PHP基础语法是开发动态网站的关键,需熟练使用变量、函数、条件判断、循环和数组。首先,变量以$开头,可存储字符串、数字等,如$name = “张三”,并用echo输出;其次,函数用function定义,可带参数和返回值,如greet($name)和add($a, $b);…

    2025年12月12日
    000
  • php原码怎么用_PHP原码、反码、补码概念与使用方法教程

    原码、反码、补码是PHP中进行位运算的基础,原码符号位加数值绝对值,反码负数数值位取反,补码负数反码加1;PHP整数默认以补码存储,可通过decbin()、~运算符与掩码模拟转换过程,结合str_pad()实现8位二进制可视化输出。 在PHP编程中,理解原码、反码和补码的概念对于进行底层运算和位操作…

    2025年12月12日
    000
  • 黑马php怎么用_黑马程序员PHP课程资源与学习方法

    答案:通过正规渠道获取黑马程序员PHP课程,搭建XAMPP开发环境,分阶段学习基础语法、面向对象、数据库操作与项目实战,并参与社区交流以提升学习效率。 如果您正在寻找高效掌握PHP编程的方法,并希望利用黑马程序员的课程资源进行系统学习,可能会遇到学习路径不清晰或资源获取困难的问题。以下是帮助您充分利…

    2025年12月12日
    000
  • php编程怎么用_PHP编程基础、开发流程与实战方法

    掌握PHP编程需遵循五步:一、安装XAMPP/WAMP搭建本地环境,启动Apache并测试;二、学习基础语法,包括变量、控制结构及输出语句;三、通过$_POST/$_GET处理表单数据,过滤输入防注入;四、用MySQLi连接数据库,执行SQL操作并处理结果;五、开启错误报告,使用var_dump调试…

    2025年12月12日
    000
  • PHP中如何高效存储和管理多个值:数组应用指南

    在php等编程语言中,直接将多个值顺序赋给同一个标量变量会导致旧值被覆盖。本文将深入探讨如何通过使用数组这一核心数据结构,实现将多个独立值关联到单一变量名下,并提供详细的创建、赋值、访问及遍历数组的方法,从而有效解决多值存储与管理问题。 1. 理解变量赋值的特性 在PHP中,一个标量变量(如字符串、…

    2025年12月12日
    000
  • 深入理解PHP中关联数组的键值遍历

    本教程详细阐述了在PHP中如何正确遍历由`array_count_values`生成的关联数组,以同时获取每个元素的键(例如商品名称)及其对应的值(例如出现次数)。通过介绍`foreach ($array as $key => $value)`语法,文章提供了一个清晰的解决方案,帮助开发者在处…

    2025年12月12日
    000
  • PHP中如何使用数组管理单个变量下的多个独立值

    在PHP编程中,当需要通过一个逻辑变量名存储和访问多个独立值时,直接的变量重赋值会导致旧值丢失。本教程将详细介绍如何利用数组这一核心数据结构来有效管理和检索多个值,从而避免数据覆盖问题,并提供清晰的代码示例,帮助开发者理解并正确应用数组来处理多值存储场景。 引言:变量赋值的原理与常见误区 在大多数编…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信