$baidu=file_get_contents(39;https://www.baidu.com');$doc=newDOMDocument();@$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
接下来我们利用和前端 JS 一样的 DOM 操作API来操作HTML里面的元素。这个例子中便是获取百度的文本框,直策应用 getElementById() 方法得到id为指定内容的 DOMElement 工具。然后就可以获取它的值、属性之类的内容了。
//获取所有图片的链接$allImageLinks=[];$imgs=$doc->getElementsByTagName('img');foreach($imgsas$img){$allImageLinks[]=$img->getAttribute('src');}print_r($allImageLinks);//Array//(//[0]=>//www.baidu.com/img/baidu_jgylogo3.gif//[1]=>//www.baidu.com/img/bd_logo.png//[2]=>http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif//)//利用parse_url剖析链接foreach($allImageLinksas$link){print_r(parse_url($link));}//Array//(//[host]=>www.baidu.com//[path]=>/img/baidu_jgylogo3.gif//)//Array//(//[host]=>www.baidu.com//[path]=>/img/bd_logo.png//)//Array//(//[scheme]=>http//[host]=>s1.bdstatic.com//[path]=>/r/www/cache/static/global/img/gs_237f015b.gif//)
这一段例子则是获取HTML文档中所有的图片链接。比较正则来说,是不是方便很多,而且代码本身便是自阐明的,不用考虑正则的匹配失落效的问题。合营其余一个PHP中自带的 parse_url() 方法也能非常方便地对链接进行剖析,提取自己想要的内容。
XML的解析和对HTML的解析也是类似的,都利用 DOMDocument 和 DOMElement 供应的这个方法接口就可以很方便的进行解析了。那么我们想要天生一个标准格式的XML呢?当然也非常的大略,不须要再去拼接字符串了,利用这个类一样的进行工具化的操作。
天生一个XML//天生一个XML文档$xml=newDOMDocument('1.0','UTF-8');$node1=$xml->createElement('First','ThisisFirstNode.');$node1->setAttribute('type','1');$node2=$xml->createElement('Second');$node2->setAttribute('type','2');$node2_child=$xml->createElement('Second-Child','ThisisSecondNodeChild.');$node2->appendChild($node2_child);$xml->appendChild($node1);$xml->appendChild($node2);print$xml->saveXML();/<?xmlversion="1.0"encoding="UTF-8"?><Firsttype="1">ThisisFirstNode.</First><Secondtype="2"><Second-Child>ThisisSecondNodeChild.</Second-Child></Second>/
实在只要有一点点的前端 JS 的根本都不丢脸出这段代码的含义。利用 createElement() 方法创造 DOMElement 工具,然后就可以为它添加属性和内容。利用 appendChild() 方法就可以为当前的 DOMElement 或者 DOMDocument 添加下级节点。末了利用 saveXML() 就能够天生标准的XML格式内容了。
总结通过上面两个大略的小例子,相信大家已经对这个 DOMDocument 操作XML类文件解析的办法非常感兴趣了。不过相对付正则解析的办法它们的性能有多大的差异并没有找到干系的测试,不过一样平常正常的情形下网站的HMTL文档都不会太大,毕竟各个网站也会考虑自身的加载速率,如果文档非常大的话用户体验也会很差,以是这套接口用来进行日常爬虫的剖析处理事情基本是没有任何问题的。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8DOMDocument%E6%9D%A5%E5%A4%84%E7%90%86HTML%E3%80%81XML%E6%96%87%E6%A1%A3.php
参考文档: https://www.php.net/manual/zh/class.domdocument.php