其实从PHP5开始,PHP就为我们提供了一个强大的类来解析和生成XML相关的操作,这就是我们今天要说的DOMDocument类。不过我估计大部分人在爬网页的时候还是喜欢用正则表达式来解析网页内容。今天学习了这个类,下次可以尝试使用这个PHP自带的方法进行解析分析。解析HTML//解析HTML$baidu=file_get_contents('https://www.baidu.com');$doc=newDOMDocument();@$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($imgsas$img){$allImageLinks[]=$img->getAttribute('src');}print_r($allImageLinks);//数组//(//[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//[路径]=>/img/baidu_jgylogo3.gif//)//数组//(//[host]=>www.baidu.com//[路径]=>/img/bd_logo.png//)//数组//(//[方案]=>http//[host]=>s1.bdstatic.com//[path]=>/r/www/cache/static/global/img/gs_237f015b.gif//)是不是感觉这么清晰和面向对象呢感觉就像第一次使用ORM库进行数据库操作。让我们一块一块地看。$baidu=file_get_contents('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);//数组//(//[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//[路径]=>/img/baidu_jgylogo3.gif//)//数组//(//[host]=>www.baidu.com//[路径]=>/img/bd_logo.png//)//数组//(//[方案]=>http//[主机]=>s1.bdstatic.com//[路径]=>/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','这是第一个节点。');$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);打印$xml->saveXML();/*
