用PHP代替JS玩转DOM的思路及示例代码


Posted in PHP onJune 15, 2014

事情的起源比较简单,我需要把一个导航页的数据整理好写入数据库。一个比较直观的方法是对html文件进行分析,通用的方法是用php的正则表达式来匹配。但是这样做开发和维护都很困难,代码可读性非常差。

导航页的数据都是规则的排列在DOM树当中的,用JS可以用几个循环轻松的对其进行操作,而且JS需要依赖浏览器,操作数据库很困难。其实PHP就有现成的类库对DOM树种的节点进行增删改查操作,在此做一些笔记。

这里涉及到2个类 DOMDocument 和 DOMXPath。

其实思路比较明确,就是通过DOMDocument将一个html file转换成DOM树的数据结构,再用DOMXPath的实例去搜索这个DOM树,拿到想要特定节点,接下来就可以对当前节点的子树进行遍历,得到想要的结果。

在当前目录下有一个这样一个导航的html文件 "./hao.html"

现在需要得到所有<a>标签的中文内容,php代码如下:

<?php 
//将html/xml文件转换成DOM树 
$dom = new DOMDocument(); 
$dom->loadHTMLFile("hao.html"); //得到所有class为fix的dl标签 
// example 1: for everything with an id 
//$elements = $xpath->query("//*[@id]"); 
// example 2: for node data in a selected id 
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']"); 
// example 3: same as above with wildcard 
//$elements = $xpath->query("*/div[@id='yourTagIdHere']"); 
$xpath = new DOMXPath($dom); 
$dls = $xpath->query('//dl[@class="fix"]'); 
foreach ($dls as $dl) { 
$spans = $dl->childNodes; 
foreach ($spans as $span) { 
echo trim($span->textContent)."\t"; 
} 
echo "\n"; 
} 
?>

输出结果如下:

注意:值得注意的一点是DOMDocument的默认编码方式是Latin,所以在处理utf编码的中文的时候,需要在<head>后面紧跟着填入

<meta http-equiv="content-type" content="text/html; charset=utf-8">

在其他位置,或者是只写上<meta content="charset=utf-8">都是不识别的哦
PHP 相关文章推荐
开发大型PHP项目的方法
Oct 09 PHP
十天学会php之第一天
Oct 09 PHP
微信扫描二维码登录网站代码示例
Dec 30 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
PHP中的正则表达式实例详解
Apr 25 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP连续签到功能实现方法详解
Dec 04 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 PHP
PHP7新增函数
Mar 09 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 #PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 #PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 #PHP
PHPAnalysis中文分词类详解
Jun 13 #PHP
ThinkPHP缓存方法S()概述
Jun 13 #PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 #PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 #PHP
You might like
Yii框架组件和事件行为管理详解
2016/05/20 PHP
php 浮点数比较方法详解
2017/05/05 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
python实现快递价格查询系统
2020/03/03 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
小学生演讲稿
2014/01/12 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
出差报告怎么写
2014/11/06 职场文书
幼儿园辞职信
2015/05/13 职场文书
小爸爸观后感
2015/06/15 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android