PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (1): [1]
Найдено сообщений: 10
bombording
Отправлено: 22 Ноября, 2013 - 13:40:48 • Тема: HTML-парсер • Форум: Пользовательские функции
Ответов: 7 Просмотров: 8908
armancho7777777
Получилось. Здорово, скрипт выполняется около 4 секунд... аналогичный парсер DOM делал это 130 секунд.
Спасибо!
А можно, используя код ниже, загонять в массив данные без html... обычный текст.
Или все же нужно использовать strip_tags() после?
bombording
Отправлено: 22 Ноября, 2013 - 11:14:14 • Тема: HTML-парсер • Форум: Пользовательские функции
Ответов: 7 Просмотров: 8908
armancho7777777
Сейчас тестирую Ваш скрипт.
Как можно разбить table tr на td элементы?
CODE (
html ):
скопировать код в буфер обмена
<table >
<tr ><td ></ td ><td ></ td ><td ></ td ><td ></ td ><td ></ td ></ tr >
<tr ><td ></ td ><td ></ td ><td ></ td ><td ></ td ><td ></ td ></ tr >
...
<tr ><td ></ td ><td ></ td ><td ></ td ><td ></ td ><td ></ td ></ tr >
<tr ><td ></ td ><td ></ td ><td ></ td ><td ></ td ><td ></ td ></ tr >
</ table >
Пробую:
Но выводится каждый td.
А мне необходимо создать массив из td элементов каждого tr.
bombording
Отправлено: 21 Ноября, 2013 - 08:32:12 • Тема: Оптимизация str_get_html (парсинг) • Форум: Вопросы новичков
Ответов: 2 Просмотров: 282
Добрый день. Имеется скрипт, который парсит html страницу.
PHP:
скопировать код в буфер обмена
require_once ( 'simple_html_dom.php' ) ;
$url = "http://site/export?file=2013-11-18" ;
$html = str_get_html( $html ) ;
foreach ( $html -> find ( 'table tr' ) as $a ) {
if ( @ $a -> find ( 'td' , 0) -> plaintext ) {
echo $a -> find ( 'td' , 1 ) -> plaintext . '<br>' ;
}
}
Сам файл 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:
скопировать код в буфер обмена
// в эти переменные передаем постом, на какой странице мы находимся.
$page = isset ( $_POST [ 'page' ] ) ?
intval ( $_POST [ 'page' ] ) : 1 ;
// сколько записей выводить на странице
$rows = 10 ;
$offset = ( $page - 1) * $rows ;
// начало
$i = 0 ;
foreach ( $html -> find ( '#table tr' ) as $a ) {
// это некое условие при котром обрабатывается массив
if ( @ $a -> find ( 'td' , 0) -> plaintext ) {
$o = new stdClass( ) ;
$o -> date = date ( 'F j, Y' , strtotime ( $a -> find ( 'td a' , 0
) -> plaintext ) ) ;
$o -> slow = $a -> find ( 'td' , 2) -> plaintext ;
$arr [ ] = $o ;
}
// задаем конец выполнения цикла
if ( ++ $i == ( $rows + $offset ) ) break ;
}
отрабатывает как надо?
Да, все хорошо работает. С начало находится #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
bombording
Отправлено: 17 Ноября, 2013 - 11:19:13 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков
Ответов: 14 Просмотров: 469
likvidator пишет: нет...форыч вообще не нужен в этом случае..хотя.можете дать дамп,хотя бы примерный
?
Там выводятся найденные теги tr в таблице:
CODE (
html ):
скопировать код в буфер обмена
<table >
<tr >
<td > 1</ td >
<td ><nobr><a href = "http://link11" > 2013-11-11</ a ></ nobr></ td >
<td ><a href = "http://link21" > Excel</ a > </ td >
</ tr >
<tr >
<td > 2</ td >
<td ><nobr><a href = "http://link21" > 2013-11-12</ a ></ nobr></ td >
<td ><a href = "http://link22" > Excel</ a > </ td >
</ tr >
</ table >
Всего тегов tr 350 штук.
Далее уже обрабатываются теги td которые находятся в tr и загоняются в массив
PHP:
скопировать код в буфер обмена
if ( @ $a -> find ( 'td' , 0) -> plaintext ) {
$o = new stdClass( ) ;
$o -> date = date ( 'F j, Y' , strtotime ( $a -> find ( 'td nobr a' , 0
) -> plaintext ) ) ; $o -> slow = $a -> find ( 'td' , 2) -> plaintext ;
$arr [ ] = $o ;
}
bombording
Отправлено: 17 Ноября, 2013 - 11:03:47 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков
Ответов: 14 Просмотров: 469
likvidator пишет: переделал
Что то не пойму куда while прописать....в сам foreach?
Делаю так, цикл отрабатывается весь но данных в массиве нету.
PHP:
скопировать код в буфер обмена
$page = 1 ;
$rows = 10 ;
$offset = ( $page - 1) * $rows ;
foreach ( $html -> find ( '#table tr' ) as $a ) {
if ( @ $a -> find ( 'td' , 0) -> plaintext ) {
while ( $offset ++< $offset + 10) {
$o = new stdClass( ) ;
$o -> date = date ( 'F j, Y' , strtotime ( $a -> find ( 'td nobr a' , 0
) -> plaintext ) ) ; $o -> slow = $a -> find ( 'td' , 2) -> plaintext ;
$arr [ ] = $o ;
}
}
//if(++$i == $rows) break;
}
bombording
Отправлено: 17 Ноября, 2013 - 10:55:02 • Тема: foreach задать начало и конец выполнения. • Форум: Вопросы новичков
Ответов: 14 Просмотров: 469
likvidator пишет: Может глупость скажу,но все же: а если попробовать через WHILE?
Просто увеличивайте значение $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:
скопировать код в буфер обмена
// в эти переменные передаем постом, на какой странице мы находимся.
$page = isset ( $_POST [ 'page' ] ) ?
intval ( $_POST [ 'page' ] ) : 1 ; // сколько записей выводить на странице
$rows = 10 ;
$offset = ( $page - 1) * $rows ;
// начало
$i = 0 ;
foreach ( $html -> find ( '#table tr' ) as $a ) {
// это некое условие при котром обрабатывается массив
if ( @ $a -> find ( 'td' , 0) -> plaintext ) {
$o = new stdClass( ) ;
$o -> date = date ( 'F j, Y' , strtotime ( $a -> find ( 'td a' , 0
) -> plaintext ) ) ; $o -> slow = $a -> find ( 'td' , 2) -> plaintext ;
$arr [ ] = $o ;
}
// задаем конец выполнения цикла
if ( ++ $i == ( $rows + $offset ) ) break ;
}
Помогите пожалуйста задать циклу что бы он добавлял в массив данные с заданным количеством шагов.
Например:
1 страница
В цикл попадают записи с 0 по 10
2 страница
В цикл попадают записи с 10 по 20
и т.д.
Страниц (1): [1]
Powered by ExBB FM 1.0 RC1. InvisionExBB