Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP中使用DOMDocument来处理HTML、XML文档

PHP中使用DOMDocument来处理HTML、XML文档

作者头像
硬核项目经理
发布于 2020-05-13 06:17:45
发布于 2020-05-13 06:17:45
3.6K02
代码可运行
举报
运行总次数:2
代码可运行

PHP中使用DOMDocument来处理HTML、XML文档

其实从PHP5开始,PHP就为我们提供了一个强大的解析和生成XML相关操作的类,也就是我们今天要讲的 DOMDocument 类。不过我估计大部分人在爬取网页时还是会喜欢用正则去解析网页内容,学了今天的这个类下回就可以尝试下使用这个PHP自带的方式来进行解析分析了。

解析HTML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 解析 HTML
$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);

// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

是不是感觉好清晰,好有面向对象的感觉。就像第一次使用 ORM库 来进行数据库操作一样的感觉。我们一段一段来看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$baidu = file_get_contents('https://www.baidu.com');

$doc = new DOMDocument();
@$doc->loadHTML($baidu);

首先是加载文档内容,这个比较好理解,直接使用 loadHTML() 方法加载 HTML 内容。它还提供了其它的几个方法,分别是:load() 从一个文件加载XML;loadXML() 从字符串加载XML;loadHTMLFile() 从文件加载HTML。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);

// object(DOMElement)#2 
//     ....

echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

接下来我们使用和前端 JS 一样的 DOM 操作API来操作HTML里面的元素。这个例子中就是获取百度的文本框,直接使用 getElementById() 方法获得id为指定内容的 DOMElement 对象。然后就可以获取它的值、属性之类的内容了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}

print_r($allImageLinks);

// Array
// (
//     [0] => //www.baidu.com/img/baidu_jgylogo3.gif
//     [1] => //www.baidu.com/img/bd_logo.png
//     [2] => http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif
// )

// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}

// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => www.baidu.com
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic.com
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

这一段例子则是获取HTML文档中所有的图片链接。相比正则来说,是不是方便很多,而且代码本身就是自解释的,不用考虑正则的匹配失效的问题。配合另外一个PHP中自带的 parse_url() 方法也能非常方便地对链接进行分析,提取自己想要的内容。

XML的解析和对HTML的解析也是类似的,都使用 DOMDocument 和 DOMElement 提供的这个方法接口就可以很方便的进行解析了。那么我们想要生成一个标准格式的XML呢?当然也非常的简单,不需要再去拼接字符串了,使用这个类一样的进行对象化的操作。

生成一个XML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 生成一个XML文档
$xml = new DOMDocument('1.0', 'UTF-8');

$node1 = $xml->createElement('First', 'This is First Node.');
$node1->setAttribute('type', '1');

$node2 = $xml->createElement('Second');
$node2->setAttribute('type', '2');
$node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
$node2->appendChild($node2_child);

$xml->appendChild($node1);
$xml->appendChild($node2);
print $xml->saveXML();

/*
<?xml version="1.0" encoding="UTF-8"?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
*/

其实只要有一点点的前端 JS 的基础都不难看出这段代码的含义。使用 createElement() 方法创造 DOMElement 对象,然后就可以为它添加属性和内容。使用 appendChild() 方法就可以为当前的 DOMElement 或者 DOMDocument 添加下级节点。最后使用 saveXML() 就能够生成标准的XML格式内容了。

总结

通过上面两个简单的小例子,相信大家已经对这个 DOMDocument 操作XML类文件解析的方式非常感兴趣了。不过相对于正则解析的方式它们的性能有多大的差异并没有找到相关的测试,不过一般正常的情况下网站的HMTL文档都不会太大,毕竟各个网站也会考虑自身的加载速度,如果文档非常大的话用户体验也会很差,所以这套接口用来进行日常爬虫的分析处理工作基本是没有任何问题的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农老张 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flowable表结构解析:深入理解工作流引擎的数据存储设计
Flowable作为一款强大的开源业务流程管理(BPM)引擎,其数据库表结构设计体现了模块化、高效性和可扩展性。本文将从表命名规则、核心引擎表结构及功能模块表三个方面,全面解析Flowable的数据库表设计。
没事学点编程小知识
2025/03/10
7470
Flowable表结构解析:深入理解工作流引擎的数据存储设计
flowable工作流所有业务概念
说起flowable还来自于activiti,因为activiti内部工作人员不合,一大堆小伙伴相约出去创业了。但是锅还是原来的锅,只不过做饭的方式不同了。所以在思想上,flowable与activiti相差不大。只不过功能更加强大了。
全栈程序员站长
2022/08/25
4.5K0
flowable工作流所有业务概念
Flowable工作流入门
本文链接:https://blog.csdn.net/qq_37059838/article/details/83576097 原作者:吕小小布
全栈程序员站长
2022/08/31
2.2K0
Flowable工作流入门
FLOWABLE流程引擎分析
历史:  flowable工作流引擎是从jboss的jbpm->alfresco的activiti->flowable 逐步演化过来的, 核心开发人员是同一个团队. 都是因为与原公司的设计理念存在分歧,导致两次出走. flowable自16年fork之后,已经成为一个活跃的社区,逐步赢得的许多工作流引擎使用者的青睐.
小锋学长生活大爆炸
2021/06/29
2.1K0
SpringBoot整合Flowable【02】- 整合初体验
由于SpringBoot2.X版本已经不再维护了,所以在创建时只能选择SpringBoot3.X版本,但是没关系,我们可以创建成功后在pom文件里修改一下。这里演示demo,我还是选择老版本咯。
别惹CC
2025/01/14
4380
SpringBoot整合Flowable【02】- 整合初体验
flowable 流程引擎总结
Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 license 协议开源。2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目。基于 Activiti v6 beta4 发布的第一个 Flowable release 版本为6.0。以 JAR 形式发布使得 Flowable 可以轻易加入任何Java环境:Java SE、Tomcat、Jetty 或 Spring 之类的 servlet 容器;JBoss 或 WebSphere 之类的 Java EE 服务器等等。 另外,也可以使用 Flowable REST API 进行 HTTP 调用。
全栈程序员站长
2022/11/01
4K0
flowable 流程引擎总结
Flowable学习笔记(一、入门)
Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例子,逐步介绍各种概念与API。
三分恶
2020/07/16
6.9K0
【第四篇】Flowable核心基础讲解
  工作流程的相关操作都是操作存储在对应的表结构中,为了能更好的弄清楚Flowable的实现原理和细节,我们有必要先弄清楚Flowable的相关表结构及其作用。在Flowable中的表结构在初始化的时候会创建五类表结构,具体如下:
用户4919348
2022/04/13
2.9K0
【第四篇】Flowable核心基础讲解
Flowable工作流入门看这篇就够了
入行几年的程序员们, 多少都对工作流有所了解。Java语言支持的工作流有很多选择, 最早的JBPM, 到现在比较出名的Activiti, Camunda, Flowable等等, 都是比较常见的开源产品。
编程思维
2023/01/26
7.9K0
【第六篇】Flowable核心流程操作的本质
业务流程定义数据表。此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY的关联是通过程序用ACT_GE_BYTEARRAY.NAME与ACT_RE_PROCDEF.NAME_完成的
用户4919348
2022/04/13
1.5K0
【第六篇】Flowable核心流程操作的本质
Flowable - 6.7.0 更新说明
实现了全局锁定机制,以便更好地支持在具有多个可流动引擎的设置中使用异步执行器。与此同时,异步执行器的默认配置也被更改为能够在默认情况下每秒处理更多作业。一个由4部分组成的系列文章描述了本系列的所有细节和性能基准,包括第1部分、第2部分、第3部分和第4部分。
FHAdmin
2021/12/03
1.2K0
flowable 表结构说明
1、Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。
FHAdmin
2022/03/15
2.1K0
Spring Boot + flowable 快速实现工作流
来源:https://blog.csdn.net/duan18888/article/details/124881904 今天分享一个不错的工作流引擎:flowable! 1. flowable-ui部署运行 flowable-6.6.0 运行 官方demo 参考文档: “ https://flowable.com/open-source/docs/bpmn/ch14-Applications/ ” 1、从官网下载flowable-6.6.0 : https://github.com/flowable/fl
程序猿DD
2023/04/04
1.4K0
Spring Boot + flowable 快速实现工作流
flowable 更新说明
修复了将所有变量传递给具有调用活动任务的子流程实例时,暂时变量变为持久变量的问题。
FHAdmin
2022/03/10
7960
Flowable数据库
Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。 ACT_RE_*: ‘RE’代表 repository 。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。 ACT_RU_*: ‘RU’代表 runtime 。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量 (variable)、作业(job)等。Activiti只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和 快。 ACT_ID_*: ‘ID’代表 identity 。这些表包含身份信息,例如用户、组等。 ACT_HI_*: ‘HI’代表 history 。这些表存储历史数据,例如已完成的流程实例、变量、任务等。 ACT_GE_*: 通用数据。用于不同场景下。
全栈程序员站长
2022/08/26
5790
Flowable-表结构
4)流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
用户10325771
2023/11/06
5860
SpringBoot+flowable快速实现工作流,so easy!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
3.4K0
玩转 Flowable 流程实例
松哥最近正在录制 TienChin 项目视频~采用 Spring Boot+Vue3 技术栈,里边会涉及到各种好玩的技术,小伙伴们来和松哥一起做一个完成率超 90% 的项目,戳戳戳这里-->TienChin 项目配套视频来啦。 ---- 1. 捋清三个概念 2. 五种流程启动方式 3. 简单实践 4. 删除流程实例 5. 获取运行的活动节点 上篇文章松哥和大家聊了 Flowable 中的流程部署问题,今天我们继续来聊聊流程实例。 部署之后的流程,这个还不能直接运行,例如我们部署了一个请假流程,现在 zhan
江南一点雨
2022/09/26
9570
玩转 Flowable 流程实例
流程引擎activiti原理_activiti流程引擎原理
4、springboot2.0整合工作流activiti6.0以及与业务集成时的一些坑
全栈程序员站长
2022/11/01
5.2K0
流程引擎activiti原理_activiti流程引擎原理
activit 表结构 flowable也大体适用
’RE’表示repository(存储),RepositoryService接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
FHAdmin
2022/03/01
4750
相关推荐
Flowable表结构解析:深入理解工作流引擎的数据存储设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验