***php解析html类库simple_html_dom

简介: 下载地址:https://github.com/samacs/simple_html_dom 一直以来使用php解析html文档树都是一个难题。Simple HTML DOM parser 帮我们很好地解决了这个问题。

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

一直以来使用php解析html文档树都是一个难题。Simple HTML DOM parser 帮我们很好地解决了这个问题。可以通过这个php类来解析html文档,对其中的html元素进行操作 (PHP5+以上版本)。

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

开始使用

上传类文件以后,有三种方式调用这个类:

从url中加载html文档

从字符串中加载html文档

从文件中加载html文档

复制代码
<?php
// 新建一个Dom实例
$html = new simple_html_dom();
 
// 从url中加载
$html->load_file('http://www.cnphp.info/php-simple-html-dom-parser-intro.html');
 
// 从字符串中加载
$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 = 'http://www.cnphp.info';
 
// 删除锚链接
$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();
?>

原文参考:http://www.cnphp.info/php-simple-html-dom-parser-intro.html

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
11月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
432 19
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
541 13
用深度学习提升DOM解析——自动提取页面关键区块
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
547 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
530 0
|
数据采集 前端开发 API
SurfGen爬虫:解析HTML与提取关键数据
SurfGen爬虫:解析HTML与提取关键数据
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
568 7
|
PHP
为什么HTML不能嵌套PHP,而PHP文件却可以嵌套HTML
当我们在服务器下访问网页时,服务器会根据文件后缀来处理文件,如果后缀是.htm or .html,则服务器不做任何处理,直接交给浏览器解析,如果后缀是.php文件,则服务器会先解析成HTML代码,然后交给浏览器解析。
2285 2
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
998 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子

热门文章

最新文章

推荐镜像

更多
  • DNS