root/lang/php/Scraper/library/Diggin/Scraper/Strategy/Xpath.php @ 16913

Revision 16913, 5.3 kB (checked in by sasezaki, 6 years ago)

lang/php/Scraper: Strategy/Xpathのエラーハンドリングの仮コミット

Line 
1<?php
2/**
3 * Diggin - Simplicity PHP Library
4 *
5 * LICENSE
6 *
7 * This source file is subject to the new BSD license.
8 * It is also available through the world-wide-web at this URL:
9 * http://framework.zend.com/license/new-bsd
10 *
11 * @category   Diggin
12 * @package    Diggin_Scraper
13 * @copyright  2006-2008 sasezaki (http://diggin.musicrider.com)
14 * @license    http://framework.zend.com/license/new-bsd     New BSD License
15 */
16
17require_once 'Diggin/Scraper/Strategy/Abstract.php';
18
19class Diggin_Scraper_Strategy_Xpath extends Diggin_Scraper_Strategy_Abstract
20{
21    protected static $_adapter = null;
22    protected static $_adapterconfig = null;
23
24    public function __destruct()
25    {
26       self::$_adapter = null;
27       self::$_adapterconfig = null;
28       parent::$_adapter = null;
29    }
30   
31    public function setAdapter(Diggin_Scraper_Adapter_Interface $adapter)
32    {
33        self::$_adapter = $adapter;
34    }
35
36    public function setAdapterConfig($config)
37    {
38        self::$_adapterconfig = $config;
39    }
40   
41    public function getAdapter()
42    {
43        if (isset(self::$_adapter)) {
44            if(self::$_adapterconfig) self::$_adapter->setConfig(self::$_adapterconfig);
45            return self::$_adapter;
46        }
47       
48        //コンストラクタで設定されてた時用
49        if (parent::$_adapter instanceof Diggin_Scraper_Adapter_Interface) {
50            if (self::$_adapterconfig) self::$_adapter->setConfig(self::$_adapterconfig);
51            return parent::$_adapter;
52        } else {
53            /**
54             * @see Diggin_Scraper_Adapter
55             */
56            require_once 'Diggin/Scraper/Adapter/Htmlscraping.php';
57            self::$_adapter = new Diggin_Scraper_Adapter_Htmlscraping();
58            if(self::$_adapterconfig) self::$_adapter->setConfig(self::$_adapterconfig);
59        }
60
61        return self::$_adapter;
62    }
63
64    /**
65     * scraping with Xpath
66     *
67     * @param Zend_Http_Response $respose
68     * @param string $process
69     * @return array $results
70     */
71    public function scrape($respose, $process)
72    {
73        $simplexml = $this->getAdapter()->readData($respose);
74       
75        return self::extract($simplexml, $process);
76    }
77   
78    public static function extract($values, $process)
79    {
80        //↓このハンドリングはxpathの記述自体が間違ってたとき(いらないかな?)
81        set_error_handler(
82            create_function('$errno, $errstr',
83            'if($errno) require_once "Diggin/Scraper/Strategy/Xpath/Exception.php";
84                throw new Diggin_Scraper_Strategy_Xpath_Exception($errstr, $errno);'
85            )
86        );
87        $results = (array) $values->xpath($process->expression);
88        restore_error_handler();
89
90        //        if (count($results) === 0) {
91        //        //@todo notice error
92        //            require_once 'Diggin/Scraper/Strategy/Exception.php';
93        //            throw new Diggin_Scraper_Strategy_Exception("couldn't find By Xpath, Process : $process");           
94        //        }
95//        if ((isset($results[0])) && ($results[0] === false)) {//これはxpath記述自体が間違ってたとき
96//            require_once 'Diggin/Scraper/Strategy/Exception.php';
97//            throw new Diggin_Scraper_Strategy_Exception("Couldn't find By Xpath, Process : $process");
98//        }
99       
100        return $results;
101    }
102
103    /**
104     * get value with DSL
105     *
106     * @param Diggin_Scraper_Context
107     * @param Diggin_Scraper_Process
108     * @return mixed
109     */
110    public function getValue($values, $process)
111    {
112        //type
113        if (strtoupper(($process->type)) === 'RAW') {
114            $strings = $values;
115        } elseif (strtoupper(($process->type)) === 'TEXT') {
116            $strings = array();
117            foreach ($values as $value) {
118                $value = strip_tags((string) str_replace('&amp;', '&', $value->asXML()));
119                $value = str_replace(array(chr(10), chr(13)), '', $value);
120                array_push($strings, $value);
121            }
122        } elseif (strtoupper(($process->type)) === 'PLAIN') {
123            $strings = array();
124            foreach ($values as $value) {
125                array_push($strings, (string) str_replace('&amp;', '&', $value->asXML()));
126            }
127               
128        } elseif (strpos($process->type, '@') === 0) {
129            $strings = array();
130            require_once 'Diggin/Scraper/Adapter/Htmlscraping.php';
131            foreach ($values as $value) {
132                if (($process->type == '@href' OR $process->type == '@src')) {
133                    array_push($strings, Diggin_Scraper_Adapter_Htmlscraping::getAbsoluteUrl((string)$value[substr($process->type, 1)], self::$_adapterconfig['url']));
134
135                    //require_once 'Diggin/Uri/Http.php';
136                    //array_push($strings, Diggin_Uri_Http::getAbsoluteUrl((string)$value[substr($process->type, 1)], self::$_adapterconfig['url']));
137                } else {
138                    array_push($strings, (string) $value[substr($process->type, 1)]);
139                }
140            }
141           
142        } else {
143            require_once 'Diggin/Scraper/Strategy/Exception.php';
144            throw new Diggin_Scraper_Strategy_Exception("Unknown value type :".$process->type);
145        }
146       
147        return $strings;
148    }
149
150}
151
Note: See TracBrowser for help on using the browser.