Помогите с Simple HTML DOM

Ф
На сайте с 15.07.2013
Offline
45
5959

Здравствуйте! Первый раз попробовал написать парсер, php практически не знаю. Помогите оптимизировать код, не знаю как его сократить, чтобы не дублировать каждый раз одни строчки.

Нужно спарсить значения тегов td с указанными классами (.name,.bar,.count), а также в td bar есть div, с него нужно парсить значение style. Всего таких элементов 25 на странице, нужно получать значение только из первых 16.

Вот краткая структура документа:


<table id="online" data-time="1375946405">
<tbody>
<tr class="black-links" data-id="64" data-k="0.049" data-c="1098" data-m="5000">
<td class="name">
<a href="/">Название</a>
</td>
<td class="bar">
<div style="background-position: -156px center;"> </div>
</td>
<td class="count">12345</td>
</tr>
<tr class="black-links" data-id="64" data-k="0.049" data-c="1098" data-m="5000">
<td class="name">
<a href="/">Название</a>
</td>
<td class="bar">
<div style="background-position: -156px center;"> </div>
</td>
<td class="count">12345</td>
</tr>
<tr class="black-links" data-id="64" data-k="0.049" data-c="1098" data-m="5000">
<td class="name">
<a href="/">Название</a>
</td>
<td class="bar">
<div style="background-position: -156px center;"> </div>
</td>
<td class="count">12345</td>
</tr>
</tbody>
</table>

Вот такой код сделал по примерам из документации:

  <?php
include('simple_html_dom.php');
// Create DOM from URL
$html = file_get_html('URL');

// Find table id=online
foreach($html->find('table[id=online]') as $article) {
$item['name'] = $article->find('td.name', 0)->plaintext;
$item['bar'] = $article->find('td.bar div', 0)->style;
$item['count'] = $article->find('td.count', 0)->plaintext;
$articles[] = $item;
$item['name'] = $article->find('td.name', 1)->plaintext;
$item['bar'] = $article->find('td.bar div', 1)->style;
$item['count'] = $article->find('td.count', 1)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 2)->plaintext;
$item['bar'] = $article->find('td.bar div', 2)->style;
$item['count'] = $article->find('td.count', 2)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 3)->plaintext;
$item['bar'] = $article->find('td.bar div', 3)->style;
$item['count'] = $article->find('td.count', 3)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 4)->plaintext;
$item['bar'] = $article->find('td.bar div', 4)->style;
$item['count'] = $article->find('td.count', 4)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 5)->plaintext;
$item['bar'] = $article->find('td.bar div', 5)->style;
$item['count'] = $article->find('td.count', 5)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 6)->plaintext;
$item['bar'] = $article->find('td.bar div', 6)->style;
$item['count'] = $article->find('td.count', 6)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 7)->plaintext;
$item['bar'] = $article->find('td.bar div', 7)->style;
$item['count'] = $article->find('td.count', 7)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 8)->plaintext;
$item['bar'] = $article->find('td.bar div', 8)->style;
$item['count'] = $article->find('td.count', 8)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 9)->plaintext;
$item['bar'] = $article->find('td.bar div', 9)->style;
$item['count'] = $article->find('td.count', 9)->plaintext;
$articles[] = $item;


$item['name'] = $article->find('td.name', 10)->plaintext;
$item['bar'] = $article->find('td.bar div', 10)->style;
$item['count'] = $article->find('td.count', 10)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 11)->plaintext;
$item['bar'] = $article->find('td.bar div', 11)->style;
$item['count'] = $article->find('td.count', 11)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 12)->plaintext;
$item['bar'] = $article->find('td.bar div', 12)->style;
$item['count'] = $article->find('td.count', 12)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 13)->plaintext;
$item['bar'] = $article->find('td.bar div', 13)->style;
$item['count'] = $article->find('td.count', 13)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 14)->plaintext;
$item['bar'] = $article->find('td.bar div', 14)->style;
$item['count'] = $article->find('td.count', 14)->plaintext;
$articles[] = $item;

$item['name'] = $article->find('td.name', 15)->plaintext;
$item['bar'] = $article->find('td.bar div', 15)->style;
$item['count'] = $article->find('td.count', 15)->plaintext;
$articles[] = $item;

}

print_r($articles);
?>

Вот что вышло:

C
На сайте с 04.02.2005
Offline
291
#1

печалько....

foreach($html->find('table[id=online]') as $article) {

Вот тут цЫкл...

а дальше цикла нет...

А может нужен?

Ф
На сайте с 15.07.2013
Offline
45
#2

Добавил цикл, работает :)

<?php

include('simple_html_dom.php');
// Create DOM from URL
$html = file_get_html('URL');

// Find
foreach($html->find('table[id=online]') as $article) {
for ($i=0; $i<=14; $i++)
{
$item['name'] = $article->find('td.name', $i)->plaintext;
$item['bar'] = $article->find('td.bar div', $i)->style;
$item['count'] = $article->find('td.count', $i)->plaintext;
$articles[] = $item;
}

}
print_r($articles);


?>
C
На сайте с 04.02.2005
Offline
291
#3

печалько... :)

от 1 до 14 - количество строк?

а Цыкл по TR - слабо?

---------- Добавлено 08.08.2013 в 11:58 ----------

а если td.name будет несколько? В общем-то их несколько...

Ф
На сайте с 15.07.2013
Offline
45
#4

С нулевой отсчёт начинается же = 15 строк.

td.name всегда одинаковое количество, я только первые 15 беру.

Тут еще вопрос возник, пытаюсь вывести результат на картинку, но не знаю как добавить в

imagepng($im, "0.png");

цикл, чтобы от 0 до 14 цифры подставлял в имя файла. В саму функцию нельзя переменную $i вставить, не работает.

C
На сайте с 04.02.2005
Offline
291
#5

1 + 14 = 15 :)

imagepng($im, "0.png");

переведи (с)

тебе код показать работы с GD?

Ф
На сайте с 15.07.2013
Offline
45
#6

вот полный код :)


// Create image
$im = imagecreatetruecolor(300, 17);
$red = imagecolorallocate($im, 0x1B, 0xAC, 0xEF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

// Make the background red
imagefilledrectangle($im, 0, 0, 299, 99, $red);

// Path to our ttf font file
$font_file = 'arial.ttf';

for ($i=0; $i<=14; $i++) {
imagefttext($im, 13, 0, 250, 15, $black, $font_file, $articles[$i][count]);
imagefttext($im, 11, 0, 10, 14, $black, $font_file, 'TEXT');
imagepng($im, "0.png");
imagedestroy($im);
echo '<img src="'. $i. '.png">';
}

Выводится 15 картинок, а создается только 1, потому что не могу прописать $i для

imagepng($im, "0.png");

в названии файла.png

C
На сайте с 04.02.2005
Offline
291
#7

imagepng($im, "$i.png"); ???

Ф
На сайте с 15.07.2013
Offline
45
#8

Я так и сделал сначала) Не работало. Все, теперь разобрался, нужно каждый раз новую картинку создавать чтобы старые значения не перекрывать.

 for ($i=0; $i<=14; $i++) {
$im = imagecreatetruecolor(300, 17);
$red = imagecolorallocate($im, 0x1B, 0xAC, 0xEF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

imagefilledrectangle($im, 0, 0, 299, 99, $red);


$font_file = 'arial.ttf';

imagefttext($im, 13, 0, 250, 15, $black, $font_file, $articles[$i][count]);
imagefttext($im, 11, 0, 10, 14, $black, $font_file, 'TEXT');
imagepng($im, "$i.png");
imagedestroy($im);
echo '<img src="'. $i. '.png">';

}

Спасибо :)

C
На сайте с 04.02.2005
Offline
291
#9

imagedestroy($im); нужно делать в каждой итерации

Ф
На сайте с 15.07.2013
Offline
45
#10

ага, уже подправил

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий