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获取网络文件的实现代码
Jan 01 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
基于Zend的Config机制的应用分析
May 02 PHP
使用ThinkPHP+Uploadify实现图片上传功能
Jun 26 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
php基本函数汇总
Jul 09 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
php cli模式下获取参数的方法
May 05 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 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
解决CodeIgniter伪静态失效
2014/06/09 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
python正则表达式抓取成语网站
2013/11/20 Python
python从入门到精通(DAY 1)
2015/12/20 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python递归法解决棋盘分割问题
2019/07/17 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
医学检验专业大学生求职信
2013/11/18 职场文书
超市活动计划书
2014/04/24 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
小学优秀班主任材料
2014/12/17 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android