php解析html类库simple_html_dom(详细介绍)


Posted in PHP onJuly 05, 2013

下载地址:https://github.com/samacs/simple_html_dom

解析器不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。它使用了类似jQuery的元素选择器,通过元素的id,class,tag等等来查找定位;同时还提供添加、删除、修改文档树的功能。当然,这样一款强大的html Dom解析器也不是尽善尽美;在使用的过程中需要十分小心内存消耗的情况。不过,不要担心;本文中,笔者在最后会为各位介绍如何避免消耗过多的内存。
开始使用
上传类文件以后,有三种方式调用这个类:
从url中加载html文档
从字符串中加载html文档
从文件中加载html文档

<?php
// 新建一个Dom实例
$html = new simple_html_dom();// 从url中加载
$html->load_file('https://3water.com');
// 从字符串中加载
$html->load('<html><body>从字符串中加载html文档演示</body></html>');
//从文件中加载
$html->load_file('path/file/test.html');
?>

如果从字符串加载html文档,需要先从网络上下载。建议使用cURL来抓取html文档并加载DOM中。
查找html元素
可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例:
<?php//查找html文档中的超链接元素
$a = $html->find('a');
//查找文档中第(N)个超链接,如果没有找到则返回空数组.
$a = $html->find('a', 0);
// 查找id为main的div元素
$main = $html->find('div[id=main]',0);
// 查找所有包含有id属性的div元素
$divs = $html->find('div[id]');
// 查找所有包含有id属性的元素
$divs = $html->find('[id]');
?>

还可以使用类似jQuery的选择器来查找定位元素:
<?php
// 查找id='#container'的元素
$ret = $html->find('#container');// 找到所有class=foo的元素
$ret = $html->find('.foo');
// 查找多个html标签
$ret = $html->find('a, img');
// 还可以这样用
$ret = $html->find('a[title], img[title]');
?>

解析器支持对子元素的查找
<?php// 查找 ul列表中所有的li项
$ret = $html->find('ul li');
//查找 ul 列表指定class=selected的li项
$ret = $html->find('ul li.selected');
?>

如果你觉得这样用起来麻烦,使用内置函数可以轻松定位元素的父元素、子元素与相邻元素
<?php
// 返回父元素
$e->parent;// 返回子元素数组
$e->children;
// 通过索引号返回指定子元素
$e->children(0);
// 返回第一个资源速
$e->first_child ();
// 返回最后一个子元素
$e->last _child ();
// 返回上一个相邻元素
$e->prev_sibling ();
//返回下一个相邻元素
$e->next_sibling ();
?>

元素属性操作
使用简单的正则表达式来操作属性选择器。
[attribute] ? 选择包含某属性的html元素
[attribute=value] ? 选择所有指定值属性的html元素
[attribute!=value]- 选择所有非指定值属性的html元素
[attribute^=value] -选择所有指定值开头属性的html元素
[attribute$=value] 选择所有指定值结尾属性的html元素
[attribute*=value] -选择所有包含指定值属性的html元素
在解析器中调用元素属性
在DOM中元素属性也是对象:
<?php
// 本例中将$a的锚链接值赋给$link变量
$link = $a->href;
?>

或者:
<?php
$link = $html->find('a',0)->href;
?

每个对象都有4个基本对象属性:
tag ? 返回html标签名
innertext ? 返回innerHTML
outertext ? 返回outerHTML
plaintext ? 返回html标签中的文本
在解析器中编辑元素
编辑元素属性的用法和调用它们是类似的:
<?php
//给$a的锚链接赋新值
$a->href = 'https://3water.com';// 删除锚链接
$a->href = null;
// 检测是否存在锚链接
if(isset($a->href)) {
//代码
}
?>

解析器中没有专门的方法来添加、删除元素,不过可以变通一下使用:
<?php
// 封装元素
$e->outertext = '<div class="wrap">' . $e->outertext . '<div>';// 删除元素
$e->outertext = '';
// 添加元素
$e->outertext = $e->outertext . '<div>foo<div>';
// 插入元素
$e->outertext = '<div>foo<div>' . $e->outertext;
?

保存修改后的html DOM文档也非常简单:
<?php
$doc = $html;
// 输出
echo $doc;
?>

如何避免解析器消耗过多内存
在本文的开篇中,笔者就提到了Simple HTML DOM解析器消耗内存过多的问题。如果php脚本占用内存太多,会导致网站停止响应等一系列严重的问题。解决的方法也很简单,在解析器加载html文档并使用完成后,记得清理掉这个对象就可以了。当然,也不要把问题看得太严重了。如果只是加载了2、3个文档,清理或不清理是没有多大区别的。当你加载了5个10个甚至更多的文档的时候,用完一个就清理一下内存绝对是对自己负责啦^_^
<?php
$html->clear();
?>

PHP 相关文章推荐
PHP制作图型计数器的例子
Oct 09 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
33道php常见面试题及答案
Jul 06 PHP
php精确的统计在线人数的方法
Oct 21 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP时间函数使用详解
Mar 21 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
Jul 05 #PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 #PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 #PHP
浅析十款PHP开发框架的对比
Jul 05 #PHP
利用PHP实现短域名互转
Jul 05 #PHP
PHP 安全检测代码片段(分享)
Jul 05 #PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 #PHP
You might like
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
Node调用Java的示例代码
2017/09/20 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python logging模块用法示例
2018/08/28 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
求职自荐信的格式
2014/04/07 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
MySQL Server层四个日志的实现
2022/03/31 MySQL