Задать вопрос

PHP Simple HTML DOM Parser. Почему не могу получить элемент?

Доброго времени суток!
Первый раз пишу парсер.
Нужно пропарсить вот такую Страничку масел, а точней информацию которая находится в таблице.
Погуглил, решил воспользоватся парсером PHP Simple HTML DOM Parser.
Частично получилось. Не могу понять, только как мне получить элементы которые указаны на скриншоте:
53d73848de20795c17ecadca7a7118e5.gif
Мой код:
<?php
include 'simple_html_dom.php';

$link = 'http://lubematch.shell.com/ru/ru/equipment/100_2_8i_avant_001755';

   $data = file_get_html($link);

   $result = array();

        foreach($data->find('td.application') as $a){

          $result['application'][] =  $a->plaintext;

        }

        foreach($data->find('td.recommendation') as $a){

            $result['recommendation'][] =  $a->plaintext;
        }

        foreach($data->find('td.capacity') as $a){

            $result['capacity'][] =  $a->plaintext;
        }

    

   echo "<pre>";
    print_r($result);
  echo "</pre>";
?>

Ответ получаю:
Array
(
    [application] => Array
        (
            [0] => Двигатель (Б (бензиновый))
            [1] => Механическая трансмиссия
            [2] => Автоматическая трансмиссия
            [3] => Дифференциал
            [4] => Охлаждающая жидкость
            [5] => Модели с автотрансмиссией, дифференциал
            [6] => Тормозная жидкость
            [7] => Колесные подшипники
            [8] => Усилитель рулевого управления
        )

    [recommendation] => Array
        (
            [0] =>              Helix Ultra 0W-40                                     
            [1] =>              Refer To Owners Handbook                                     
            [2] =>              Spirax S2 ATF AX                                     
            [3] =>              От коробки передач                                     
            [4] =>              Refer To Owners Handbook                                     
            [5] =>              Spirax S5 ATE 75W-90                                     
            [6] =>              Refer To Technical                                     
            [7] =>              Gadus S3 V220C 2                                     
            [8] =>                                        (b)           
        )

    [capacity] => Array
        (
            [0] =>              5.0                        
            [1] =>                           (a)           
            [2] =>                           (a)           
            [3] =>                                      
            [4] =>              11.0                        
            [5] =>              1.0                        
            [6] =>                                      
            [7] =>                                      
            [8] =>                                      
        )

)

Заранее буду благодарен за помощь.
  • Вопрос задан
  • 11707 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
alekciy
@alekciy
Вёбных дел мастер
Use XPath, Luke.
<?php

// [1- Скачиваем файл
// Создаем поток
$opts = array(
	'http' => array(
		'method'  => 'GET',
		'timeout' => 10,
	),
);

$context = stream_context_create($opts);

// Открываем файл с помощью установленных выше HTTP-заголовков
$page_content = file_get_contents('http://lubematch.shell.com/ru/ru/equipment/100_2_8i_avant_001755', false, $context);
// -1]

// [2- Парсим данные
// [3- Строим DOM
// по сути - отключаем вывод ошибок валидации
libxml_use_internal_errors(true);
$page_dom = new \DOMDocument();

$page_dom->strictErrorChecking = false;
$page_dom->preserveWhiteSpace  = false;
$page_dom->validateOnParse     = true;

$page_dom = new \DOMDocument();

// [4- loadHTML не дает использовать utf-8, делаем хаком http://php.net/manual/en/domdocument.loadhtml.php#95251
$page_dom->loadHTML('<?xml encoding="UTF-8">' . $page_content);

foreach ($page_dom->childNodes as $node) {
	if ($node->nodeType == XML_PI_NODE) {
		$page_dom->removeChild($node);
	}
}
$page_dom->encoding = 'UTF-8';
// -4]

$page_xpath = new \DOMXPath($page_dom);
// -3]

// Вытаскиваем Standard
$param_1 = $page_xpath->query('//table[@id="recommendation"]//tr[2]/th')->item(0)->nodeValue;
// Вытаскиваем Spirax S4 ATF HDX
$param_2 = $page_xpath->query('//table[@id="recommendation"]//tr[5]/td[1]')->item(0)->nodeValue;
// -2]

var_dump($param_1, $param_2);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Lobotomist
@Lobotomist
Software Developer
Если посмотреть исходный код странички - станет ясно, почему отмеченный текст не попадает в выборку.
Например, ты ищешь td с классом recommendation, но не все td в третьем столбце имеют этот класс. Например тут <td>Spirax S4 ATF HDX</td> этого класса нет. Так же ты вообще не берешь данные из столбца, в котором лежат заголовки <th class="tiername tiername">Standard</th>, откуда же им у тебя взяться? =)

Я бы на твоем месте по какому-нибудь другому принципу парсил. Какую структуру ты в итоге хочешь получить?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы