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

复制代码 代码如下:

<?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); 

时间: 2024-09-14 20:00:30

php实现的一个很好用HTML解析器类可用于采集数据_php实例的相关文章

TinyXML:一个优秀的C++ XML解析器(转载)

/* 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及

一个很不错的PHP翻页类_php实例

复制代码 代码如下: <?php /* * Created on 2007-6-8 * Programmer : Alan , Msn - haowubai@hotmail.com * PHP100.com Develop a project PHP - MySQL - Apache * Window - Preferences - PHPeclipse - PHP - Code Templates */ //为了避免重复包含文件而造成错误,加了判断函数是否存在的条件: if(!function

PHP的一个完美GIF等比缩放类,附带去除缩放黑背景_php实例

现在写东西都喜欢封装成类.....大家调用一下就行了..我就不说怎么调用了 复制代码 代码如下: <?phpclass resize_image{   private $o_img_width;//原图像宽度   private $o_img_height;//原图像高度   private $n_img_width;//新图像宽度   private $n_img_height;//新图像高度   private $o_img_file;//原图像文件   private $o_img_sou

使用70行Python代码实现一个递归下降解析器的教程_python

 第一步:标记化 处理表达式的第一步就是将其转化为包含一个个独立符号的列表.这一步很简单,且不是本文的重点,因此在此处我省略了很多. 首先,我定义了一些标记(数字不在此中,它们是默认的标记)和一个标记类型:   token_map = {'+':'ADD', '-':'ADD', '*':'MUL', '/':'MUL', '(':'LPAR', ')':'RPAR'} Token = namedtuple('Token', ['name', 'value']) 下面就是我用来标记 `expr`

java-新手问一个很奇怪的问题

问题描述 新手问一个很奇怪的问题 class Demo { int num = 1; int add = 2; Demo() { num = 5; add = 6; } void show() { System.out.println("Fu num="+num+" Fu add="+add); } } class DemoA extends Demo { DemoA() { this.num = 3; this.add = 4; } void show() { S

字符串-一个很基础的返回值问题

问题描述 一个很基础的返回值问题 想要打印字符串数组,去掉中间的空格和Tab,并且删除全为空的行,哪里有错?谢谢. #include #define MAXLINE 1000 int getline(char line[], int maxline); int copy(char to[],char from[]); int main(){ int len; int max; char line[MAXLINE]; max=0; while ((len=getline(line,MAXLINE)

js-最近遇到一个很醉人的问题 我有两个项目 当我单独打开a项目的时候 ..

问题描述 最近遇到一个很醉人的问题 我有两个项目 当我单独打开a项目的时候 .. 最近遇到一个很醉人的问题 我有一个项目 分为两次打开 当我单独打开a项目的时候 里面的有个功能是缺失的关掉后 打开b项目那个功能又恢复了 a和b是相同的项目 他们的代码是一样的 更有意思的是当我两个项目都运行的时候 a和b的功能又全都恢复了 我关掉B 再次运行A 功能又缺失了 解决方案 我猜测应该去对比一下配置文件跟机器的运行环境的log文件

c语言 单片机-keil4开发中遇到的一个很奇怪的问题。

问题描述 keil4开发中遇到的一个很奇怪的问题. void main(){ // uchar test_i; const uchar timp_button=0xfF; //this value is that the button havn't sticked uchar n_delay; //delay unsigned char j=0; unsigned char i; intend_initiation(); //调用时间设定程序 while(1){ if((hour==alarm_

android,一个很简单的demo,一运行就出错,谁能帮我看看怎么回事。

问题描述 android,一个很简单的demo,一运行就出错,谁能帮我看看怎么回事. eclipse上也没有错误提示,怎么运行不了.安装好就提示停止运行. 文件 解决方案 看logcat的日志,或者进入调试模式运行,一步步调 解决方案二: 亲,绑定布局空间是要通过布局管理者来获取的,不然就是空指针错误.具体如下 解决方案三: 用调试模式调试吧,很方便的. 解决方案四: 要看log日志的啊.看日志才知道哪里出错了, 解决方案五: fragment控件初始化的问题吧 解决方案六: fragment控