PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 10
bombording Отправлено: 22 Ноября, 2013 - 13:40:48 • Тема: HTML-парсер • Форум: Пользовательские функции

Ответов: 7
Просмотров: 8908
armancho7777777
Получилось. Здорово, скрипт выполняется около 4 секунд... аналогичный парсер DOM делал это 130 секунд.
Спасибо!

А можно, используя код ниже, загонять в массив данные без html... обычный текст.
Или все же нужно использовать strip_tags() после?

PHP:
скопировать код в буфер обмена
  1. $result = array_map(
  2.     function($tr) {
  3.         return $tr->xPath('./td');
  4.     },
  5.     parseHtml($html)->xPath('//tr')
  6. );
bombording Отправлено: 22 Ноября, 2013 - 11:14:14 • Тема: HTML-парсер • Форум: Пользовательские функции

Ответов: 7
Просмотров: 8908
armancho7777777
Сейчас тестирую Ваш скрипт.

Как можно разбить table tr на td элементы?

CODE (html):
скопировать код в буфер обмена
  1. <table>
  2. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  3. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  4. ...
  5. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  6. <tr><td></td><td></td><td></td><td></td><td></td></tr>
  7. </table>
  8.  

Пробую:

PHP:
скопировать код в буфер обмена
  1. $result = parseHtml($html)->xPath('//tr//td');
  2.  
  3. foreach($result as $item)
  4. {
  5.     echo $item->text, '<br>';
  6. }
  7.  


Но выводится каждый td.
А мне необходимо создать массив из td элементов каждого tr.
bombording Отправлено: 21 Ноября, 2013 - 08:32:12 • Тема: Оптимизация str_get_html (парсинг) • Форум: Вопросы новичков

Ответов: 2
Просмотров: 282
Добрый день. Имеется скрипт, который парсит html страницу.
PHP:
скопировать код в буфер обмена
  1. require_once('simple_html_dom.php');
  2. $url = "http://site/export?file=2013-11-18";
  3. $html = file_get_contents($url); // получаем экспортируемый файл с html
  4. $html = str_get_html($html);
  5.     foreach($html->find('table tr') as $a){
  6.         if (@$a->find('td',0)->plaintext) {
  7.              echo $a->find('td',1)->plaintext . '<br>';
  8.         }
  9.     }


Сам файл html кода, который доступен по ссылке http://site/export?file=2013-11-18 представляет собой табличку <table><tr><td> и занимает около 500 кб.
file_get_contents отрабатывает мгновенно.
А вот str_get_html - обрабатывается подка 3-х минут.

Вопрос:
Возможно ли как то оптимизировать код, что бы парсинг страницы происходил быстрее?
bombording Отправлено: 17 Ноября, 2013 - 11:35:52 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
likvidator пишет:
А ваш код
PHP:
скопировать код в буфер обмена
  1.  
  2. // в эти переменные передаем постом, на какой странице мы находимся.
  3.  
  4.         $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  5.  
  6.         // сколько записей выводить на странице
  7.  
  8.         $rows = 10;
  9.  
  10.  
  11.  
  12.         $offset = ($page-1)*$rows;
  13.  
  14.  
  15.  
  16. $ar = array();
  17.  
  18. // начало
  19.  
  20. $i = 0;
  21.  
  22.     foreach($html->find('#table tr') as $a){
  23.  
  24.         // это некое условие при котром обрабатывается массив
  25.  
  26.         if (@$a->find('td',0)->plaintext) {
  27.  
  28.                 $o = new stdClass();
  29.  
  30.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  31.  
  32.                 $o->slow=$a->find('td',2)->plaintext;
  33.  
  34.                 $arr[] = $o;
  35.  
  36.         }
  37.  
  38.         // задаем конец выполнения цикла
  39.  
  40.        if(++$i == ($rows+$offset)) break;
  41.  
  42.     }

отрабатывает как надо?


Да, все хорошо работает. С начало находится #table tr, затем все td из каждого tr загоняются в массив.

Комманда if(++$i == ($rows+$offset)) break; Останавливает выполнение цикла в положенном месте.
bombording Отправлено: 17 Ноября, 2013 - 11:26:59 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
likvidator пишет:
вы не поняли... сделайте и дайте:

Оно выдает только Array(), причем я указываю print_r.

Данную комманду $html->find('#table tr') обрабатывает известная библиотека парсинга HTML_DOM
PHP:
скопировать код в буфер обмена
  1. include 'simple_html_dom.php';
  2.  
  3. $url = "test.htm";
  4. $html = file_get_html($url) or die("Could not access site: $url");
  5.  
bombording Отправлено: 17 Ноября, 2013 - 11:19:13 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
likvidator пишет:
нет...форыч вообще не нужен в этом случае..хотя.можете дать дамп,хотя бы примерный
?

Там выводятся найденные теги tr в таблице:

CODE (html):
скопировать код в буфер обмена
  1.   <table>
  2.   <tr>
  3.     <td>1</td>
  4.     <td><nobr><a href="http://link11">2013-11-11</a></nobr></td>
  5.     <td><a href="http://link21">Excel</a> </td>
  6.   </tr>
  7.  
  8.   <tr>
  9.     <td>2</td>
  10.     <td><nobr><a href="http://link21">2013-11-12</a></nobr></td>
  11.     <td><a href="http://link22">Excel</a> </td>
  12.   </tr>
  13. </table>

Всего тегов tr 350 штук.

Далее уже обрабатываются теги td которые находятся в tr и загоняются в массив

PHP:
скопировать код в буфер обмена
  1.         if (@$a->find('td',0)->plaintext) {
  2.                 $o = new stdClass();
  3.                 $o->date=date('F j, Y', strtotime($a->find('td nobr a',0)->plaintext));
  4.                 $o->slow=$a->find('td',2)->plaintext;
  5.                 $arr[] = $o;
  6.         }
bombording Отправлено: 17 Ноября, 2013 - 11:03:47 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
likvidator пишет:
переделал

Что то не пойму куда while прописать....в сам foreach?

Делаю так, цикл отрабатывается весь но данных в массиве нету.
PHP:
скопировать код в буфер обмена
  1.  
  2.         $page =1;
  3.         $rows =10;
  4.         $offset = ($page-1)*$rows;
  5.  
  6.  
  7.     foreach($html->find('#table tr') as $a){
  8.         if (@$a->find('td',0)->plaintext) {
  9.             while($offset++<$offset+10){
  10.                 $o = new stdClass();
  11.                 $o->date=date('F j, Y', strtotime($a->find('td nobr a',0)->plaintext));
  12.                 $o->slow=$a->find('td',2)->plaintext;
  13.                 $arr[] = $o;
  14.             }
  15.         }
  16.        //if(++$i == $rows) break;
  17.     }
bombording Отправлено: 17 Ноября, 2013 - 10:55:02 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
likvidator пишет:
Может глупость скажу,но все же: а если попробовать через WHILE?
PHP:
скопировать код в буфер обмена
  1.  
  2. while($i++<count($html->find('#table tr'))){
  3. };

Просто увеличивайте значение $i

count($html->find('#table tr')) у меня ровно 350.

Тут будет немного другое. На первой странице будут все 350 записей и с каждой страницей они будут уменьшаться на $i...
bombording Отправлено: 17 Ноября, 2013 - 10:46:11 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
DelphinPRO пишет:
вам не цикл нужно ограничивать, а выбирать только нужные данные в него.
При выборе из БД данный вопрос решается с помощью оператора LIMIT

Это верно. Но в данном случае работает парсер (DOM), и данные берутся не из SQL а из обычного html....в этом то и вся сложность.

Не хотелось бы отказываться от постраничного вывода, может быть есть способ сделать это в цикле?
bombording Отправлено: 17 Ноября, 2013 - 09:53:40 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков

Ответов: 14
Просмотров: 469
Добрый день!
Имеется цикл, который добавляет данные в массив. Мне необходимо сделать вывод данных постранично. Для этого необходимо задать циклу начало и конец выполнения.

PHP:
скопировать код в буфер обмена
  1.        
  2.         // в эти переменные передаем постом, на какой странице мы находимся.
  3.         $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
  4.         // сколько записей выводить на странице
  5.         $rows = 10;
  6.  
  7.         $offset = ($page-1)*$rows;
  8.  
  9. $ar = array();
  10. // начало
  11. $i = 0;
  12.     foreach($html->find('#table tr') as $a){
  13.         // это некое условие при котром обрабатывается массив
  14.         if (@$a->find('td',0)->plaintext) {
  15.                 $o = new stdClass();
  16.                 $o->date=date('F j, Y', strtotime($a->find('td a',0)->plaintext));
  17.                 $o->slow=$a->find('td',2)->plaintext;
  18.                 $arr[] = $o;
  19.         }
  20.         // задаем конец выполнения цикла
  21.        if(++$i == ($rows+$offset)) break;
  22.     }
  23.  


Помогите пожалуйста задать циклу что бы он добавлял в массив данные с заданным количеством шагов.

Например:

1 страница
В цикл попадают записи с 0 по 10

2 страница
В цикл попадают записи с 10 по 20

и т.д.

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB