Antonoff
@Antonoff
Разработчик

Не получаеться правильно спарсить с PHP Simple Dom Parser?

Вообщем, пытаюсь спарисить простую информацию, но никак не получаеться это сделать:

Я хочу спарсить статистику команды - Ссылка

Скриншот

Wins / draws / losses - 363 / 8 / 168
Total kills - 50715
Total deaths - 45101
Rounds played - 14083
K/D Ratio - 1.12
Best player(Average rating) - olofmeister (1.15)

Паршу с помощью Simple HTML Dom PHP

Начал с элементарного:

include 'simple_html_dom.php';

$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
$html = file_get_html($url);

foreach($html->find('a') as $element) {
    echo $element->href . '<br>';
}

$html->clear();
unset($html);


Всё работает и выводи результат

Скриншот

Но когда пытаюсь выбрать информацию, ту которая мне нужна, никак не выходит и я получаю simple_html_dom Object *RECURSION* ошибку.

include 'simple_html_dom.php';

$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
$html = file_get_html($url);
$results = $html->find('div[style="padding-left:5px;padding-top:5px;"]');
print_r($results);
$html->clear();
unset($html);


UPDATE:

include 'simple_html_dom.php';

$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';

$results = file_get_html($url)->plaintext;

print_r($results);


Попробывал конвернуть все в plaintext, но этот вариант, тоже не вариант.

UPDATE:

include 'simple_html_dom.php';

$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
$html = file_get_html($url);

foreach ($html->find('div.covSmallHeadline[style="font-weight:normal;width:100px;float:left;"]') as $div) {
    echo $div . '<br />';
};

foreach ($html->find('div.covSmallHeadline[style="font-weight:normal;width:180px;float:left;color:black;text-align:right;"]') as $div) {
    echo $div . '<br />';
};


Получил первый результаты, теперь осталось, обьединить осталось склеить их в один массив.

Заранее спасибо
  • Вопрос задан
  • 1597 просмотров
Решения вопроса 2
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
Не лучший источник для парсинга, но можно сделать например так:
<?php
	include 'simple_html_dom.php';
	
	$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
	$cacheFile = dirname(__FILE__).'/'.md5($url);
	
	if (!file_exists($cacheFile)) {
		if ($html = file_get_contents($url)) {
			file_put_contents($cacheFile, $html);
		} else die('Can\'t get html');
	} else {
		$html = file_get_contents($cacheFile);
	}
	
	$items = [];
	$dom = str_get_html($html);
	if ($domElements = $dom->find('div.covGroupBoxContent')){
		foreach($domElements as $domBox) {
			if (!strpos($domBox->plaintext, 'Key stats')) continue;
			if ($domBoxElements = $domBox->find('div.covSmallHeadline')) {
				$item = [];
				foreach($domBoxElements as $k=>$element) {
					if (!$k) continue;
					$item[] = $element->plaintext;
					if ($k%2==0) {
						$items[] = $item;
						$item = [];
					}
				}
			}
		}
	}
	
	echo '<pre>';
	print_r($items);
	echo '</pre>';


результат:

Array
(
    [0] => Array
        (
            [0] => Maps played
            [1] => 539
        )

    [1] => Array
        (
            [0] => Wins / draws / losses
            [1] => 363 / 8 / 168
        )

    [2] => Array
        (
            [0] => Total kills
            [1] => 50715
        )

    [3] => Array
        (
            [0] => Total deaths
            [1] => 45101
        )

    [4] => Array
        (
            [0] => Rounds played
            [1] => 14083
        )

    [5] => Array
        (
            [0] => K/D Ratio
            [1] => 1.12
        )

    [6] => Array
        (
            [0] => Best player (Average rating)
            [1] => olofmeister (1.15)
        )
)


P.S. Кусок с кешированием только не забудь убрать, он нужен только на время отладки, чтобы ускорить процесс и не дергать внешний сервер.
Ответ написан
Antonoff
@Antonoff Автор вопроса
Разработчик
Вот что у меня получилось:

include 'simple_html_dom.php';

$url = 'http://www.hltv.org/?pageid=179&teamid=4991&gameid=2';
$html = file_get_html($url);

$item;
foreach ($html->find('div.covGroupBoxContent div.covSmallHeadline') as $div) {
    if(isset($div->style) && strpos($div->style, "color:black;text-align:right;") !== false) {
		$item["stat-data"] = $div->plaintext;
		$item["stat-title"] = $div->prev_sibling ()->plaintext;
		$items[] = $item;
	}
};

print_r($items);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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