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

Revision 9333, 4.7 kB (checked in by sasezaki, 6 years ago)

lang/php/Scraper: CSSSelector追加ほか

Line 
1<?php
2/**
3 * Diggin - Library Of PHP
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 getAdapter()
37    {
38        if (isset(self::$_adapter)) {
39            return self::$_adapter;
40        }
41       
42        //コンストラクタで設定されてた時用
43        if (parent::$_adapter instanceof Diggin_Scraper_Adapter_Interface) {
44            if(self::$_adapterconfig) self::$_adapter->setConfig(self::$_adapterconfig);
45            return parent::$_adapter;
46        } else {
47            /**
48             * @see Diggin_Scraper_Adapter
49             */
50            require_once 'Diggin/Scraper/Adapter/Htmlscraping.php';
51            self::$_adapter = new Diggin_Scraper_Adapter_Htmlscraping();
52            if(self::$_adapterconfig) self::$_adapter->setConfig(self::$_adapterconfig);
53        }
54
55        return self::$_adapter;
56    }
57
58    /**
59     * scraping with Xpath
60     *
61     * @param Zend_Http_Response $respose
62     * @param string $process
63     * @return
64     */
65    public function scrape($respose, $process)
66    {
67        $simplexml = $this->getAdapter()->readData($respose);
68 
69        $results = array();       
70        foreach ($simplexml->xpath($process->expression) as $count => $result) {
71            $results[] = $result;
72        }
73       
74        return $results;
75    }
76   
77    /**
78     * get value with DSL
79     *
80     * @param Diggin_Scraper_Context
81     * @param Diggin_Scraper_Process
82     * @return array
83     */
84    public function getValue($context, $process)
85    {
86        if (!isset($process->type)) {
87            return $context->scrape($process);
88        }
89       
90        $values = $context->scrape($process);
91
92        //type
93        if (strtoupper(($process->type)) === 'TEXT') {
94           
95            $strings = array();
96            foreach ($values as $value) {
97                //@todo strict
98                //array_push($strings, (string) $value);
99                array_push($strings, strip_tags((string) str_replace('&amp;', '&', $value->asXML())));
100            }
101        } elseif (strtoupper(($process->type)) === 'PLAIN') {
102            $strings = array();
103            foreach ($values as $value) {
104                array_push($strings, (string) str_replace('&amp;', '&', $value->asXML()));
105            }
106               
107        } elseif (strpos($process->type, '@') === 0) {
108            $strings = array();
109            foreach ($values as $value) {
110                //@todo
111                if (($process->type == '@href' OR $process->type == '@src')){
112                    //&& method_exists($this->getAdapter(), 'getAbsoluteUrl')) {
113                    //array_push($strings, $this->getAdapter()->getAbsoluteUrl((string)$value[substr($process->type, 1)], self::$_adapterconfig['url']));
114                    require_once 'Diggin/Uri/Http.php';
115                    array_push($strings, Diggin_Uri_Http::getAbsoluteUrl((string)$value[substr($process->type, 1)], self::$_adapterconfig['url']));
116                } else {
117                    array_push($strings, (string) $value[substr($process->type, 1)]);
118                }
119            }
120           
121        } else {
122            require_once 'Diggin/Scraper/Exception.php';
123            throw new Diggin_Scraper_Exception("can't understand type");
124        }
125       
126        //filtering
127        if ($process->filter) {
128            //@todo zendloadclass
129            require_once 'Diggin/Scraper/Filter.php';
130            $filterObj = new Diggin_Scraper_Filter(new ArrayIterator($strings));
131           
132            foreach ($filterObj as $value) {
133                $return[] = $value;
134            }
135        } else {
136            $return = $strings;
137        }
138
139        //スクレイプ該当が1件だったときに、
140        if (count($return) === 1) {
141            $return = (string) array_shift($return);
142        }
143       
144        return $return;
145    }
146
147}
148
Note: See TracBrowser for help on using the browser.