php实现的一个很好用HTML解析器类可用于采集数据

 更新时间:2013年09月23日 17:24:33   转载 作者:  
下面就是这个 HTML解析类及用法,下面的功能是采集www.opendir.cn这个网站的百度收录数据,需要的朋友可以测试下
复制代码 代码如下:

<?php  
 $oldSetting = libxml_use_internal_errors( true );   
libxml_clear_errors();  
/**
 * 
 * -+-----------------------------------
 * |PHP5 Framework - 2011
 * |Web Site: www.iblue.cc
 * |E-mail: mejinke@gmail.com
 * |Date: 2012-10-12
 * -+-----------------------------------
 * 
 * @desc HTML解析器
 * @author jingke
 */   
class XF_HtmlDom  
{  
    private $_xpath = null;  
    private $_nodePath = '';  

    public function __construct($xpath = null, $nodePath = '')  
    {  
        $this->_xpath = $xpath;  
        $this->_nodePath = $nodePath;  
    }  

    public function loadHtml($url)  
    {  
        ini_set('user_agent', 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus');  
        $content = '';  
        if(strpos(strtolower($url), 'http')===false)  
        {  
            $content = file_get_contents($url);  
        }  
        else 
        {  
            $ch = curl_init();   
            $user_agent = "Baiduspider+(+http://www.baidu.com/search/spider.htm)";  
            $user_agent1='Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0';  
            curl_setopt($ch, CURLOPT_URL, $url);   
            curl_setopt($ch, CURLOPT_HEADER, false);   
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
            curl_setopt($ch, CURLOPT_REFERER, $url);  
            curl_setopt($ch, CURLOPT_USERAGENT, $user_agent1);  
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);  
            $content =curl_exec($ch);   
            curl_close($ch);  
        }  

        $html = new DOMDocument();   
        $html->loadHtml($content);   
        $this->_xpath = new DOMXPath( $html );   
        //return $this; 

    }  

    public function find($query, $index = null)  
    {  
        if($this->_nodePath == '')  
            $this->_nodePath = '//'; 
        else 
            $this->_nodePath .= '/';  

        $nodes = $this->_xpath->query($this->_nodePath.$query);  
        //echo $nodes->item(0)->getNodePath();exit; 

          
        if ($index == null && !is_numeric($index))   
        {   
            $tmp = array();  
            foreach ($nodes as $node)   
            {  
                $tmp[] = new XF_HtmlDom($this->_xpath, $node->getNodePath());  
            }  
            return $tmp;  
        }  
        return new XF_HtmlDom($this->_xpath,$this->_xpath->query($this->_nodePath.$query)->item($index)->getNodePath());  
    }  

    /**
     * 获取内容
     */ 
    public function text()  
    {  
        if ($this->_nodePath != '' && $this->_xpath != null )   
            return $this->_xpath->query($this->_nodePath)->item(0)->textContent;  
        else 
            return false;  
    }  

    /**
     * 获取属性值
     */ 
    public function getAttribute($name)  
    {  
        if ($this->_nodePath != '' && $this->_xpath != null )   
            return $this->_xpath->query($this->_nodePath)->item(0)->getAttribute($name);  
        else 
            return false;  
    }  

    public function __get($name)  
    {  
        if($name == 'innertext')  
            return $this->text();  
        else 
            return $this->getAttribute($name);  
    }    
}    
$xp = new xf_HtmlDom();  
$xp->loadHtml('http://www.aizhan.com/siteall/www.opendir.cn/'); 
$rows = $xp->find("td[@id='baidu']/a", 0)->innertext;  
print_r($rows); 

相关文章

  • PHP Hash算法:Times33算法代码实例

    PHP Hash算法:Times33算法代码实例

    这篇文章主要介绍了PHP Hash算法:Times33算法代码实例,本文直接给出实现代码,需要的朋友可以参考下
    2015-05-05
  • thinkphp实现上一篇与下一篇的方法

    thinkphp实现上一篇与下一篇的方法

    这篇文章主要介绍了thinkphp实现上一篇与下一篇的方法,以实例形式对比分析了两种不同的实现方法供大家选择,方法二在方法一的基础上增加了判断的功能,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • 分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html

    分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为htm

    这篇文章主要介绍了分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html,需要的朋友可以参考下
    2015-12-12
  • 解决laravel groupBy 对查询结果进行分组出现的问题

    解决laravel groupBy 对查询结果进行分组出现的问题

    今天小编就为大家分享一篇解决laravel groupBy 对查询结果进行分组出现的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • PHP递归算法的简单实例

    PHP递归算法的简单实例

    今天小编就为大家分享一篇关于PHP递归算法的简单实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • php实现分页工具类分享

    php实现分页工具类分享

    本文分享一个php实现的分页工具类,代码内有注释,大家参考使用吧
    2014-01-01
  • 详解php中的implements 使用

    详解php中的implements 使用

    php类中接口的应用关键字是interface、implements了,接口是一种成员属性全部为抽象或常量的特殊抽象类,implements主要是对类名,类所拥有的方法,以及所传参数起约束和规范做用,有点像 abstract 抽象类
    2017-06-06
  • PHP常用处理静态操作类

    PHP常用处理静态操作类

    本文给大家分享的是我们在php开发的时候经常需要用到的一些静态操作类,都是个人整理的,推荐给大家,有需要的小伙伴可以参考下。
    2015-04-04
  • PHP使Laravel为JSON REST API返回自定义错误的问题

    PHP使Laravel为JSON REST API返回自定义错误的问题

    这篇文章主要介绍了PHP使Laravel为JSON REST API返回自定义错误的问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • php屏蔽错误及提示的方法

    php屏蔽错误及提示的方法

    在本篇文章里小编给大家分享的是关于php屏蔽错误及提示的方法,需要的朋友们可以学习下。
    2020-05-05

最新评论