在日常的Web开发工作中,我们经常需要处理HTML文档,并从中提取特定信息,比如链接、图片地址等。今天,我就遇到了一个典型的场景,需要从一个复杂的HTML页面中提取所有<a>
标签的href
属性值,以便进行进一步的数据分析或内容聚合。通过这个过程,我发现了PHP DOM解析器的强大之处,它不仅能帮助我们轻松处理HTML文档,还能保证数据的准确性和完整性。
在最近的一个项目中,我负责维护一个内容聚合平台。该平台需要从多个外部网站抓取新闻摘要,并展示给用户。然而,这些外部网站的HTML结构各不相同,有的非常复杂,包含多层嵌套的<div>
和<span>
标签,使得直接通过字符串操作提取<a>
标签的href
变得既繁琐又容易出错。此外,这些网站还经常更新,HTML结构也会随之变化,这进一步增加了维护的难度。
为了高效且稳定地解决这个问题,我决定采用PHP内置的DOM解析器。DOM解析器允许我们将HTML文档加载为一个DOM对象,然后像操作XML文档一样,使用DOM API来遍历和查询文档中的元素。这种方法不仅代码清晰,易于维护,而且能够自动处理HTML文档中的复杂结构,大大提高了数据提取的准确性和效率。
下面是我用来提取HTML中所有<a>
标签href
值的PHP代码示例:
// 创建一个新的DOMDocument实例 $dom = new DOMDocument(); // 加载HTML字符串 @$dom->loadHTML($contents, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // 使用@来抑制警告 // 获取所有的<a>标签 $links = $dom->getElementsByTagName('a'); // 遍历所有<a>标签 foreach ($links as $link) { // 提取href属性值 $href = $link->getAttribute('href'); echo $href . PHP_EOL; }
加载HTML内容:通过file_get_contents()
函数或cURL(如果是网络资源)获取HTML内容。这里为了示例方便,我直接使用了字符串模拟。
创建DOMDocument实例:实例化DOMDocument
类,这是处理HTML文档的基础。
加载HTML字符串:使用loadHTML()
方法将HTML字符串加载到DOMDocument对象中。注意,这里使用了@
来抑制可能的警告,但在实际开发中,我们应该处理这些警告,以避免隐藏潜在的问题。
获取<a>
标签:通过getElementsByTagName()
方法获取文档中所有的<a>
标签。这个方法返回一个DOMNodeList
对象,包含了所有匹配的元素。
遍历并提取href:使用foreach
循环遍历DOMNodeList
对象中的每个<a>
标签,并通过getAttribute('href')
方法提取其href
属性值。
处理href:在提取到href
之后,你可以根据需要进行进一步的处理,比如去重、验证URL的有效性、存储到数据库等。
通过使用PHP DOM解析器,我成功地解决了从复杂HTML文档中提取<a>
标签href
值的问题。这种方法不仅提高了数据提取的准确性和效率,还使得代码更加清晰和易于维护。在实际工作中,当遇到类似的需求时,我强烈推荐使用DOM解析器来处理HTML文档。
PHP的session文件夹默认保存在同一个文件,随着访客的增多,访问的速度会非常慢,例如部分管理系统后台每天登陆1000次,1个月就创建了30000个session文件,一年后是多少?假设这个系统的用户是上万人呢?方法1:每个网站使用自己的session文件夹,代码如下:<?php $pat...
<?php $data=array('a'=>1,'b'=>2,'c'=>3,'d'=>4); extract($data); var_dump($a,$b,$c,$d); ?>在人人商城中捡到的...
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...
使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...
elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{ "require": { &...