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通用检测函数集合
Nov 25 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 PHP
php多文件上传实现代码
Feb 20 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
Apr 08 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 18 PHP
七种PHP开发环境搭建工具
Jun 28 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
Sony CFR 320 修复改造
2020/03/14 无线电
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
拼音码表的生成
2006/10/09 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
调用jQuery滑出效果时闪烁的解决方法
2014/03/27 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
node.js中的buffer.copy方法使用说明
2014/12/14 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
js图片上传的封装代码
2017/08/01 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
详解python3实现的web端json通信协议
2016/12/29 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
关于颐和园的导游词
2015/01/30 职场文书
怎样写辞职信
2015/02/27 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android