Completed
Push — master ( 015af1...10bfe8 )
by Maciej
02:38
created

ModelHtmlScrapper::getModelGroupCssSelector()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * File: ModelHtmlScrapper.php
4
 *
5
 * @author      Maciej Sławik <[email protected]>
6
 * Github:      https://github.com/maciejslawik
7
 */
8
9
namespace MSlwk\Otomoto\App\Model\Scrapper;
10
11
use MSlwk\Otomoto\App\Manufacturer\Data\ManufacturerDTOInterface;
12
use MSlwk\Otomoto\App\Model\Data\ModelDTO;
13
use MSlwk\Otomoto\App\Model\Data\ModelDTOArray;
14
use Symfony\Component\DomCrawler\Crawler;
15
16
/**
17
 * Class ModelHtmlScrapper
18
 * @package MSlwk\Otomoto\App\Model\Scrapper
19
 */
20
class ModelHtmlScrapper implements ModelHtmlScrapperInterface
21
{
22
    const HTML_MODEL_DATA_NODE_SELECTOR = 'section#body-container';
23
    const HTML_MODEL_DATA_NODE_ATTRIBUTE = 'data-facets';
24
    const MODEL_DATA_JSON_KEY = 'filter_enum_model';
25
26
    /**
27
     * @param string $html
28
     * @return ModelDTOArray
29
     */
30
    public function scrapModels(string $html): ModelDTOArray
31
    {
32
        $modelDTOArray = new ModelDTOArray();
33
34
        $modelOptions = $this->getModelsElements($html);
35
36
        foreach ($modelOptions as $model => $numberOfOffers) {
37
            $modelDTO = new ModelDTO($model);
38
            $modelDTOArray->add($modelDTO);
39
        }
40
41
        return $modelDTOArray;
42
    }
43
44
    /**
45
     * @param string $html
46
     * @return array
47
     */
48
    private function getModelsElements(string $html): array
49
    {
50
        $crawler = new Crawler($html);
51
52
        $modelListNode = $crawler->filter(self::HTML_MODEL_DATA_NODE_SELECTOR)->getNode(0);
53
        $jsonData = $modelListNode->getAttribute(self::HTML_MODEL_DATA_NODE_ATTRIBUTE);
54
        $encodedData = json_decode($jsonData, true);
55
        return $encodedData[self::MODEL_DATA_JSON_KEY];
56
    }
57
}
58