Паршу сайт в цикле, и рандомного редко возникает такая ситуация, когда как будто на сайте слетает верстка.
Думал сперва что быстро паршу — поставил задержу, проблему не решило. Если найти ту страницу где была проблема и прогнать ее парсером 50-100 раз, то 1-2 раза я получу кашу в получаемых данных.
Причину я так и не понял, но пытался ее решить с помощью goto эта конструкция почему то у меня не срабатывает.
Вот код
for ($n = 0; $n < count($links_IP_array); $n++) {
up:
.......
$url2 = "https://site.ru" . $links_IP_array[$n];
$pars2 = getPageByUrl($url2);
... далее распаршиваю страницу
if (preg_match('~^<em(.*)~m', $statusORG, $statusORGMatch)){
//словил баг, хочу эту страницу в этом же цикле опять перезагрузить. То что регулярка работает верно, проверилgoto up; //почему он не срабатывает и не перебрасывает в начало цикла?
}
Sly32
Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS
Dram
Sly32 #: Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS
Понятно что готу плохо и т.п. Но почему не срабатывает?
hellhead2011
ну так оператор так в цикле и не будет работать — вот почитайте тут об этом https://www.php.net/manual/ru/control-structures.goto.php
Ключевое предложение там по вашей ошибке: Вы не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break .
PHP: goto — Manual
www.php.net
(PHP 5 >= 5.3.0, PHP 7) Изображение предоставлено » xkcd Оператор используется для перехода в другую часть программы. Место, куда необходимо перейти указывается с помощью метки, за которой ставится двоеточие, после оператора указывается желаемая метка для перехода. Оператор не является неограниченным «». Целевая метка должна находиться в том же…
Dram
hellhead2011 #:
ну так оператор так в цикле и не будет работать —
Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.
hellhead2011
Dram #:
Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.
в пределах цикла сработает только выход из него
Dram
hellhead2011 #: в пределах цикла сработает только выход из него
Понял, спасибо! Есть какие то другие пути подняться вверх внутри данного цикла?
Dram
придумал
$n- —
И continue
hellhead2011
ну так цикл подразумевает уже поднятие и опускание, пока есть условие для этого 🙂 просто поставьте условие, когда баг словлен, то вашей переменной N задайте нужное значение :
if (preg_match('~^<em(.*)~m', $statusORG, $statusORGMatch)){
//словил баг, хочу эту страницу в этом же цикле опять перезагрузить. То что регулярка работает верно, проверил
$n = $n-1 ; //например
} главное чтобы это не превратилось в постоянный цикл, если спаршиваемая страница будет недоступна или ещё какой-либо баг отдавать - лучше подстраховаться и сделать количество попыток на парсинг определённой страницы
Skom
Если нужно скипнуть остальную часть цикла, то просто
Dram
Паршу сайт в цикле, и рандомного редко возникает такая ситуация, когда как будто на сайте слетает верстка.
Думал сперва что быстро паршу — поставил задержу, проблему не решило. Если найти ту страницу где была проблема и прогнать ее парсером 50-100 раз, то 1-2 раза я получу кашу в получаемых данных.
Причину я так и не понял, но пытался ее решить с помощью goto эта конструкция почему то у меня не срабатывает.
Вот код
Sly32
Dram
Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS
Понятно что готу плохо и т.п. Но почему не срабатывает?
hellhead2011
ну так оператор так в цикле и не будет работать — вот почитайте тут об этом https://www.php.net/manual/ru/control-structures.goto.php
Ключевое предложение там по вашей ошибке: Вы не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break .
Dram
ну так оператор так в цикле и не будет работать —
Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.
hellhead2011
Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.
в пределах цикла сработает только выход из него
Dram
в пределах цикла сработает только выход из него
Понял, спасибо! Есть какие то другие пути подняться вверх внутри данного цикла?
Dram
придумал
hellhead2011
ну так цикл подразумевает уже поднятие и опускание, пока есть условие для этого 🙂 просто поставьте условие, когда баг словлен, то вашей переменной N задайте нужное значение :
Skom
Если нужно скипнуть остальную часть цикла, то просто
continue;