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中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
DedeCms模板安装/制作概述
Mar 11 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
PHP使用CURL_MULTI实现多线程采集的例子
Jul 29 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 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
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
客户端静态页面玩分页
2006/06/26 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
Bootstrap CSS布局之表格
2016/12/17 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
使用Python读取安卓手机的屏幕分辨率方法
2018/03/31 Python
django自定义模板标签过程解析
2019/12/14 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
CSS3 分类菜单效果
2019/05/27 HTML / CSS
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
四年的个人工作自我评价
2013/12/10 职场文书
员工工作表扬信范文
2014/01/13 职场文书
领导检查欢迎词
2014/01/14 职场文书
党支部公开承诺书
2014/03/28 职场文书
安全口号大全
2014/06/21 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
自主招生英文自荐信
2015/03/25 职场文书
Golang并发操作中常见的读写锁详析
2021/08/30 Golang
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python