php中html解析器,PHP Simple HTML DOM解析器

闻人修平
2023-12-01

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

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

如何使用php html 解析

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

从url中加载html文档

从字符串中加载html文档

从文件中加载html文档

1

2

3

4

5

6

7

8

9

10

11

12

13

// 新建一个Dom实例

$html =new simple_html_dom();

// 从url中加载

// 从字符串中加载

$html->load('

从字符串中加载html文档演示');

//从文件中加载

$html->load_file('path/file/test.html');

?>

如果从字符串加载html文档,需要先从网络上下载。建议使用cURL来抓取html文档并加载DOM中。

查找html元素

可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//查找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的选择器来查找定位元素:

1

2

3

4

5

6

7

8

9

10

11

12

13

// 查找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]');

?>

解析器支持对子元素的查找

1

2

3

4

5

6

7

8

9

// 查找 ul列表中所有的li项

$ret =$html->find('ul li');

//查找 ul 列表指定class=selected的li项

$ret =$html->find('ul li.selected');

?>

如果你觉得这样用起来麻烦,使用内置函数可以轻松定位元素的父元素、子元素与相邻元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 返回父元素

$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中元素属性也是对象:

1

2

3

4

// 本例中将$a的锚链接值赋给$link变量

$link =$a->href;

?>

或者:

1

2

3

$link =$html->find('a',0)->href;

?>

每个对象都有4个基本对象属性:

tag – 返回html标签名

innertext – 返回innerHTML

outertext – 返回outerHTML

plaintext – 返回html标签中的文本

在解析器中编辑元素

编辑元素属性的用法和调用它们是类似的:

1

2

3

4

5

6

7

8

9

10

11

12

//给$a的锚链接赋新值

// 删除锚链接

$a->href = null;

// 检测是否存在锚链接

if(isset($a->href)) {

//代码

}

?>

解析器中没有专门的方法来添加、删除元素,不过可以变通一下使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// 封装元素

$e->outertext ='

' .$e->outertext .'
';

// 删除元素

$e->outertext ='';

// 添加元素

$e->outertext =$e->outertext .'

foo
';

// 插入元素

$e->outertext ='

foo
' .$e->outertext;

?>

保存修改后的html DOM文档也非常简单:

1

2

3

4

5

6

$doc =$html;

// 输出

echo $doc;

?>

如何避免解析器消耗过多内存

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

1

2

3

$html->clear();

?>

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

PHP Simple HTML DOM解析器使用入门

http://www.cnphp.info/php-simple-html-dom-parser-intro.html 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM ...

PHP HTML DOM 解析器 中文手册

简单的PHP HTML DOM 解析器 中文手册 | PHP Simple HTML DOM Parser中文手册 目录 快速入门 如何创建HTML DOM 对象? 如何查找HTML元素? 如何访问H ...

dom解析器机制 web基本概念 tomcat

0 作业[cn.itcast.xml.sax.Demo2]   1)在SAX解析器中,一定要知道每方法何时执行,及SAX解析器会传入的参数含义 1 理解dom解析器机制 1)dom解析和dom4j原理 ...

使用Dom解析器,操作XML里面的信息

import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...

JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

JAVA与DOM解析器基础 学习笔记

要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的 ...

解析XML文件之使用DOM解析器

在前面的文章中.介绍了使用SAX解析器对XML文件进行解析.SAX解析器的长处就是占用内存小.这篇文章主要介绍使用DOM解析器对XML文件进行解析. DOM解析器的长处可能是理解起来比較的直观,当然, ...

Java DOM解析器 - 解析XML文档

使用DOM的步骤 以下是在使用DOM解析器解析文档使用的步骤. 导入XML相关的软件包. 创建DocumentBuilder 从文件或流创建一个文档 提取根元素 检查属性 检查子元素 导入XML相关的 ...

Java DOM解析器

文档对象模型是万维网联盟(W3C)的官方推荐.它定义了一个接口,使程序能够访问和更新样式,结构和XML文档的内容.支持DOM实现该接口的XML解析器. 何时使用? 在以下几种情况时,应该使用DOM解析 ...

随机推荐

语义网 (Semantic Web)和 web 3.0

语义网=有意义的网络. "如果说 HTML 和 WEB 将整个在线文档变成了一本巨大的书,那么 RDF, schema, 和 inference languages 将会使世界上所有的数据变 ...

file_put_contents保存数据,

file_put_contents("sui.txt", var_export($now_member,TRUE),FILE_APPEND); 可以保存数组,方便调试

更新页面缓存OutputCache

为什么要使用OutputCache 我认为OutputCache是最简单的缓存技术了,它针对的是页面级别的,简单的一条指令就可以达到缓存的效果,有效的减轻服务器的压力和减少带宽,对于网站一些不会频繁更 ...

golang语言部分保留字的举例

golang和c的代码有很大不同的,一不小心就会误用. 1 /* go保留字: */ /* break default func interface select case defer go map ...

nginx+redis缓存微信的token数据

上一篇文章我们讲了如何在负载均衡的项目中使用redis来缓存session数据,戳这里. 我们在项目的进展过程中,不仅需要缓存session数据,有时候还需要缓存一些别的数据,比如说,微信的acces ...

20170319 - pycurl 提示 libcurl link-time version is older than compile-time version

使用 conda update anaconda 升级后,运行程序得到如下提示: ImportError: pycurl: libcurl link-time version (7.45.0) is ...

mysql查询今日、本周、本月记录

SELECT * FROM table_name WHERE to_days(createtime) = to_days(now()); SELECT * FROM table_name WHERE ...

HDU 1079 Calendar Game(规律博弈)

题目链接:https://cn.vjudge.net/problem/HDU-1079 题目: Adam and Eve enter this year’s ACM International Col ...

2.2 数据的图形描绘以及处理(QQplot,归一化)

QQplot 横坐标表示的是属性的其中一个测量值1,纵坐标表示另一个测量值2.散点是分位点.点的横纵坐标是这个测量值1和测量值2的分位点的取值. from scipy import stats fro ...

鸟哥的Linux私房菜——第九章

视频链接,推荐看B站 土豆网:http://www.tudou.com/programs/view/XmMDbjJHJC8 B站:http://www.bilibili.com/video/av966 ...

 类似资料: