PHP中使用DOMDocument来处理HTML、XML文档的示例

admin3年前PHP教程66
目录
解析HTML生成一个XML总结

其实从PHP5开始,PHP就为我们提供了一个强大的解析和生成XML相关操作的类,也就是我们今天要讲的 DOMDocument 类。不过我估计大部分人在爬取网页时还是会喜欢用正则去解析网页内容,学了今天的这个类下回就可以尝试下使用这个PHP自带的方式来进行解析分析了。

解析HTML
// 解析 HTML
$baidu = file_get_contents('baidu');
 
$doc = new DOMDocument();
@$doc->loadHTML($baidu);
 
// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
 
// object(DOMElement)#2
//     ....
 
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd
 
// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}
 
print_r($allImageLinks);
 
// Array
// (
//     [0] => //baidu/img/baidu_jgylogo3.gif
//     [1] => //baidu/img/bd_logo.png
//     [2] => s1.bdstatic/r/www/cache/static/global/img/gs_237f015b.gif
// )
 
// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}
 
// Array
// (
//     [host] => baidu
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => baidu
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

是不是感觉好清晰,好有面向对象的感觉。就像第一次使用 ORM库 来进行数据库操作一样的感觉。我们一段一段来看。


$baidu = file_get_contents('baidu');
 
$doc = new DOMDocument();
@$doc->loadHTML($baidu);

首先是加载文档内容,这个比较好理解,直接使用 loadHTML() 方法加载 HTML 内容。它还提供了其它的几个方法,分别是:load() 从一个文件加载XML;loadXML() 从字符串加载XML;loadHTMLFile() 从文件加载HTML。


// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
 
// object(DOMElement)#2
//     ....
 
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

首先是加载文档内容,这个比较好理解,直接使用 loadHTML() 方法加载 HTML 内容。它还提供了其它的几个方法,分别是:load() 从一个文件加载XML;loadXML() 从字符串加载XML;loadHTMLFile() 从文件加载HTML。


// 百度输出框
$inputSearch = $doc->getElementById('kw');
var_dump($inputSearch);
 
// object(DOMElement)#2
//     ....
 
echo $inputSearch->getAttribute('name'), PHP_EOL; // wd

接下来我们使用和前端 JS 一样的 DOM 操作API来操作HTML里面的元素。这个例子中就是获取百度的文本框,直接使用 getElementById() 方法获得id为指定内容的 DOMElement 对象。然后就可以获取它的值、属性之类的内容了。


// 获取所有图片的链接
$allImageLinks = [];
$imgs = $doc->getElementsByTagName('img');
foreach($imgs as $img){
    $allImageLinks[] = $img->getAttribute('src');
}
 
print_r($allImageLinks);
 
// Array
// (
//     [0] => //baidu/img/baidu_jgylogo3.gif
//     [1] => //baidu/img/bd_logo.png
//     [2] => s1.bdstatic/r/www/cache/static/global/img/gs_237f015b.gif
// )
 
// 利用 parse_url 分析链接
foreach($allImageLinks as $link){
    print_r(parse_url($link));
}
 
// Array
// (
//     [host] => baidu
//     [path] => /img/baidu_jgylogo3.gif
// )
// Array
// (
//     [host] => baidu
//     [path] => /img/bd_logo.png
// )
// Array
// (
//     [scheme] => http
//     [host] => s1.bdstatic
//     [path] => /r/www/cache/static/global/img/gs_237f015b.gif
// )

这一段例子则是获取HTML文档中所有的图片链接。相比正则来说,是不是方便很多,而且代码本身就是自解释的,不用考虑正则的匹配失效的问题。配合另外一个PHP中自带的 parse_url() 方法也能非常方便地对链接进行分析,提取自己想要的内容。

XML的解析和对HTML的解析也是类似的,都使用 DOMDocument 和 DOMElement 提供的这个方法接口就可以很方便的进行解析了。那么我们想要生成一个标准格式的XML呢?当然也非常的简单,不需要再去拼接字符串了,使用这个类一样的进行对象化的操作。

生成一个XML
// 生成一个XML文档
$xml = new DOMDocument('1.0', 'UTF-8');
 
$node1 = $xml->createElement('First', 'This is First Node.');
$node1->setAttribute('type', '1');
 
$node2 = $xml->createElement('Second');
$node2->setAttribute('type', '2');
$node2_child = $xml->createElement('Second-Child', 'This is Second Node Child.');
$node2->appendChild($node2_child);
 
$xml->appendChild($node1);
$xml->appendChild($node2);
print $xml->saveXML();
 
/*
<?xml version="1.0" encoding="UTF-8"?>
<First type="1">This is First Node.</First>
<Second type="2"><Second-Child>This is Second Node Child.</Second-Child></Second>
*/

其实只要有一点点的前端 JS 的基础都不难看出这段代码的含义。使用 createElement() 方法创造 DOMElement 对象,然后就可以为它添加属性和内容。使用 appendChild() 方法就可以为当前的 DOMElement 或者 DOMDocument 添加下级节点。最后使用 saveXML() 就能够生成标准的XML格式内容了。

总结

通过上面两个简单的小例子,相信大家已经对这个 DOMDocument 操作XML类文件解析的方式非常感兴趣了。不过相对于正则解析的方式它们的性能有多大的差异并没有找到相关的测试,不过一般正常的情况下网站的HMTL文档都不会太大,毕竟各个网站也会考虑自身的加载速度,如果文档非常大的话用户体验也会很差,所以这套接口用来进行日常爬虫的分析处理工作基本是没有任何问题的。

测试代码: github/zhangyue050…

以上就是PHP中使用DOMDocument来处理HTML、XML文档的示例的详细内容,更多关于PHP DOMDocument处理HTML、XML的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

php7中停止php-fpm服务的方法详解

在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。各个服务器抽象层之间遵守着相同的约定,这里我们称之为SAPI接口。在PHP的源码中,当需要调用服务器相关信息时,全部通过SAP...

php bcdiv和bcmul 函数的怪异现象

一、简介我要实现这样一个表达式z=总奖金n=总名数i=自己的排民((n-i+1)/(1+2+3+…n))*z这是一个分配奖金的式子。我试着用php的bc函数进行操作发现以下两种写法得出不...

显卡服务器一般是用来做什么香港显卡服务器适合哪些行业购买

服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机(如PC机、智能手机、ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务。服务器具有高速的CPU运算...

香港大带宽服务器连接失败怎么处理

香港大带宽服务器连接失败怎么处理?如果您无法连接到香港大带宽服务器,则可能需要采取以下步骤:检查网络连接:确保您的本地计算机和香港大带宽服务器之间有可用的网络连接。您可以尝试使用ping命令测试服务器...

哪些企业需要租用厦门高防服务器

哪些企业需要租用厦门高防服务器?需要租用厦门高防服务器的企业主要包括以下几类:电子商务平台:电子商务平台需要处理大量的交易和用户数据,因此需要具备高性能和安全性能的服务器来确保稳定的运营,并防范DDo...

新加坡gpu服务器可以租来渲染吗

新加坡gpu服务器可以租来渲染吗?如果你需要进行大规模的图形渲染任务,可能需要一台强大的GPU服务器来完成。有一些服务提供商可以提供新加坡GPU服务器的租赁服务,让你可以轻松地进行图形渲染和其他计算密...