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


Posted in PHP onSeptember 23, 2013
<?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 相关文章推荐
PHP生成带有雪花背景的验证码
Sep 28 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
PHP使用数组实现队列
Feb 05 PHP
初品cakephp 入门基础
Feb 16 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
php将html转为图片的实现方法
May 19 PHP
php-fpm添加service服务的例子
Apr 27 PHP
在PHP中实现使用Guzzle执行POST和GET请求
Oct 15 PHP
PHP加密函数 Javascript/Js 解密函数
Sep 23 #PHP
配置php网页显示各种语法错误
Sep 23 #PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 #PHP
php数据类型判断函数有哪些
Sep 23 #PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 #PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 #PHP
PHP导航下拉菜单的实现如此简单
Sep 22 #PHP
You might like
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
brook javascript框架介绍
2011/10/10 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
使用angular写一个hello world
2015/01/23 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Python中的连接符(+、+=)示例详解
2017/01/13 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
python读写csv文件实例代码
2019/07/05 Python
django表单的Widgets使用详解
2019/07/22 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
python代码区分大小写吗
2020/06/17 Python
python 实现的车牌识别项目
2021/01/25 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
会计系毕业个人自荐信格式
2013/09/23 职场文书
工商学院毕业生自荐信
2013/11/12 职场文书
安全资料员岗位职责
2013/12/14 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
公司财务部岗位职责
2015/04/14 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
教师听课学习心得体会
2016/01/15 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android