这三个组件有各自独特的功能:
- CURL能够抓取下载HTML,能模拟登陆,伪装客户端等
- DOMDocument将下载的HTML加载成DOM
- DOMXPath使用XPath语法进行数据的定位和采集
下面是一个具体的例子代码,抓取了本博客www.crazyant.net首页所有的超链接:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php $target_url = "http://crazyant.net"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$target_url); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $html = curl_exec($ch); if (!$html) { echo "<br />cURL error number:" .curl_errno($ch); echo "<br />cURL error:" . curl_error($ch); exit; } //创建一个DomDocument对象,用于处理一个HTML $dom = new DOMDocument(); //从一个字符串加载HTML @$dom->loadHTML($html); //使该HTML规范化 $dom->normalize(); //用DOMXpath加载DOM,用于查询 $xpath = new DOMXPath($dom); #获取所有的a标签的地址 $hrefs = $xpath->evaluate("/html/body//a//@href"); for ($i = 0; $i < $hrefs->length; $i++) { $href = $hrefs->item($i); $linktext = $href->nodeValue; echo $linktext; echo "<BR>"; } ?>
要注意点,DOMNode 类并没有getAttribute方法,所以无法根据a得到直接的属性值,这时可以用正则匹配解决,网上看到很多人直接在DOMNode 上使用了getAttribute方法竟然通过,实在是匪夷所思,如果有更好的解释,请您给我说一说,我很渴望知道怎样直接从Xpath的返回直接得到属性值。
文章很实用啊,标记一下,留用。
爽。。我都羡慕了。
这个真的有用吗52284
专程来顶你ajdgt
爽。。我都羡慕了。http://www.ddjcm.com
我觉得还好吧58478
不错,博文很好!学习了!