Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: как правильно получить содержимое страницы

 PHP.SU

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


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

> Без описания
catanginus
Отправлено: 23 Февраля, 2019 - 22:36:32
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




Здравствуйте,
как правильно получить содержимое страницы

PHP:
скопировать код в буфер обмена
  1.  
  2. echo " <a href='index.php?id=3'>Авторизация</a>";
  3. echo "<div id=12>!!!!!!</div>";
  4.  
  5. dom = new DOMDocument;
  6. $dom->loadHTML($url);
  7.  
  8. foreach ($dom->documentElement->childNodes as $node)
  9. {
  10.     echo $node->nodeName;
  11.     echo '<br>....<br>';
  12.     echo print_r( $node );
  13. }
  14.  
  15.  


поучаю body а то что отправлено
echo " <a href='index.php?id=3'>Авторизация</a>";
echo "<div id=12>!!!!!!</div>";
нету
почему подскажите пожалуйста?
 
 Top
Vladimir Kheifets
Отправлено: 24 Февраля, 2019 - 09:52:42
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




catanginus пишет:
Здравствуйте,
как правильно получить содержимое страницы

Добрый день!
Видимо Вы хотели бы не получить содержимое, а спарсить html-страницу.
Примерно так:
Спойлер (Отобразить)
Фрагмент результата:
Спойлер (Отобразить)
Удачи!

(Отредактировано автором: 24 Февраля, 2019 - 09:55:09)

 
 Top
catanginus
Отправлено: 24 Февраля, 2019 - 11:29:18
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




спасибо так получается
а как сделать чтобы курлы ети не тормозили так? file_get_contents_curl($url)
 
 Top
Vladimir Kheifets
Отправлено: 24 Февраля, 2019 - 14:54:03
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




catanginus пишет:
спасибо так получается
а как сделать чтобы курлы ети не тормозили так? file_get_contents_curl($url)

Альтернатива функция file_get_contents, но говорят curl работает быстрее:
https://web-answers.ru/php/php-file_get_contents-ili-curl-u-kogo-kruche-proizvoditelnost.html

(Отредактировано автором: 24 Февраля, 2019 - 14:54:53)

 
 Top
catanginus
Отправлено: 24 Февраля, 2019 - 16:57:15
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




Я только не могу понять почему dom не работает
то же самое принципе


PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. echo " <a href='index.php?id=3'>Авторизация</a>";
  4. echo "<div id=12>!!!!!!</div>";
  5.  
  6.  
  7. $dom = new DOMDocument;
  8. $dom->loadHTML($url);
  9.  
  10. foreach ($dom->documentElement->childNodes as $node)
  11. {
  12.     echo "node:",$node->nodeName,"<br>";
  13.     if( $node->childNodes)
  14.         {  
  15.                
  16.             foreach ($node->childNodes as $node2)
  17.                 {
  18.                         echo "node2:",$node2->nodeName,"<br>";
  19.                      
  20.  
  21.                 }
  22.                  
  23.                
  24.         }
  25. }
  26.  
  27.  


и не работает
параграф какой-то откуда то берёт

(Отредактировано автором: 24 Февраля, 2019 - 16:59:15)

 
 Top
Vladimir Kheifets
Отправлено: 25 Февраля, 2019 - 07:30:17
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




catanginus пишет:
Я только не могу понять почему dom не работает
то же самое принципе
PHP:
скопировать код в буфер обмена
  1.  
  2. echo " <a href='index.php?id=3'>Авторизация</a>";
  3. echo "<div id=12>!!!!!!</div>";
  4. $dom = new DOMDocument;
  5. $dom->loadHTML($url);
  6. foreach ($dom->documentElement->childNodes as $node)
  7. {
  8.     echo "node:",$node->nodeName,"<br>";
  9.     if( $node->childNodes)
  10.         {  
  11.                
  12.             foreach ($node->childNodes as $node2)
  13.                 {
  14.                         echo "node2:",$node2->nodeName,"<br>";
  15.                      
  16.  
  17.                 }
  18.                  
  19.                
  20.         }
  21. }
  22.  

и не работает
параграф какой-то откуда то берёт


Добрый день!
У Вас в коде не видно как опредяляется значение переменной $url в $dom->loadHTML($url);
В ней доджна быть:
Цитата:
public DOMDocument::loadHTML( string $source[, int $options = 0] ) : bool


Не работет потому, что ,вероятно, туда не попал контент сайта.
Определим значение переменной $url:
Спойлер (Отобразить)
И получим:
Спойлер (Отобразить)
Удачи!

(Отредактировано автором: 25 Февраля, 2019 - 07:44:50)

 
 Top
catanginus
Отправлено: 27 Февраля, 2019 - 23:03:18
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




точно что контент не попадант но
вот url
$url="http://r91933pi.beget.tech/";

но все равно curl этот то работает то нет да еще и долго так не нормально
может от того что у меня линукс?
а dom
не поучает что на сайте

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. <?php
  4. echo " <a href='index.php?id=3'>Авторизация</a>";
  5. echo "<div id=12>!!!!!!</div>";
  6.  
  7.  
  8. $url="http://r91933pi.beget.tech/";
  9. $html=file_get_contents_curl($url);
  10. $dom=new DOMDocument();
  11. $dom->loadHTML($html);
  12. //$dom->saveHTML();    
  13.        
  14. $str = '1';
  15. $i = 0;
  16.  
  17.  
  18. function node($n, $str, $i)
  19. {
  20.    foreach ($n as $node)
  21.    {
  22.        $str .= $node->nodeName ;
  23.        
  24.        if( $node->childNodes)
  25.            {
  26.               $i = $i + 1;
  27.              $str .=  ' ' . node($node->childNodes, $str, $i) . ' <br> ' . $i  ;
  28.               if($i == 30) { break; /* на случай ошибки */ }
  29.            
  30.    
  31.            }
  32.            
  33.    }
  34.    return $str;
  35. }
  36.  
  37. $r = node($dom->documentElement->childNodes, $str, $i);
  38.  
  39.  
  40.  
  41.  
  42. echo $r;
  43.  
  44.  
  45. //#####################################################
  46. function file_get_contents_curl($url)
  47. {
  48.    $ch=curl_init();
  49.    curl_setopt($ch,CURLOPT_HEADER,0);
  50.    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  51.    curl_setopt($ch, CURLOPT_ENCODING, "");
  52.    curl_setopt($ch,CURLOPT_URL,$url);
  53.    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  54.    $data=curl_exec($ch);
  55.    curl_close($ch);
  56.    return $data;
  57. }
  58.  
  59.  
 
 Top
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 07:51:48
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




catanginus пишет:
точно что контент не попадант но
вот url
$url="http://r91933pi.beget.tech/";

но все равно curl этот то работает то нет да еще и долго так не нормально
может от того что у меня линукс?
а dom
не поучает что на сайте

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. <?php
  4. echo " <a href='index.php?id=3'>Авторизация</a>";
  5. echo "<div id=12>!!!!!!</div>";
  6.  
  7.  
  8. $url="http://r91933pi.beget.tech/";
  9. $html=file_get_contents_curl($url);
  10. $dom=new DOMDocument();
  11. $dom->loadHTML($html);
  12. //$dom->saveHTML();    
  13.        
  14. $str = '1';
  15. $i = 0;
  16.  
  17.  
  18. function node($n, $str, $i)
  19. {
  20.    foreach ($n as $node)
  21.    {
  22.        $str .= $node->nodeName ;
  23.        
  24.        if( $node->childNodes)
  25.            {
  26.               $i = $i + 1;
  27.              $str .=  ' ' . node($node->childNodes, $str, $i) . ' <br> ' . $i  ;
  28.               if($i == 30) { break; /* на случай ошибки */ }
  29.            
  30.    
  31.            }
  32.            
  33.    }
  34.    return $str;
  35. }
  36.  
  37. $r = node($dom->documentElement->childNodes, $str, $i);
  38.  
  39.  
  40.  
  41.  
  42. echo $r;
  43.  
  44.  
  45. //#####################################################
  46. function file_get_contents_curl($url)
  47. {
  48.    $ch=curl_init();
  49.    curl_setopt($ch,CURLOPT_HEADER,0);
  50.    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  51.    curl_setopt($ch, CURLOPT_ENCODING, "");
  52.    curl_setopt($ch,CURLOPT_URL,$url);
  53.    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  54.    $data=curl_exec($ch);
  55.    curl_close($ch);
  56.    return $data;
  57. }
  58.  

Добрый день!
curl этот работает
Добавьте, пожалуйста, в 13 строку:
PHP:
скопировать код в буфер обмена
  1. echo "<pre>";var_dump($dom);echo "</pre>";
и Вы увидите , что страница, которую Вы хотите парзить выдаёт 403 ошибку:
Спойлер (Отобразить)

Добавил пару строк в function file_get_contents_curl:
PHP:
скопировать код в буфер обмена
  1. function file_get_contents_curl($url)
  2. {
  3.     $ch=curl_init();
  4.     curl_setopt($ch,CURLOPT_HEADER,0);
  5.     curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  6.     curl_setopt($ch, CURLOPT_ENCODING, "");
  7.     curl_setopt($ch,CURLOPT_URL,$url);
  8.     curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  9.     $data=curl_exec($ch);
  10.     $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  11.     curl_close($ch);
  12.     return $httpCode==200?$data:$httpCode;
  13. }
Добавьте, пожалуйста, проверку в Ваш код:
Спойлер (Отобразить)
Удачи!

(Отредактировано автором: 28 Февраля, 2019 - 08:32:39)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Февраля, 2019 - 10:37:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vladimir Kheifets пишет:
return $httpCode==200?$data:$httpCode;

И как понимать, что же ответил сервер?

Ну и заодно замечу, что после curl_exec необходимо проверять чем завершился сам curl_exec:
PHP:
скопировать код в буфер обмена
  1. if (curl_errno($ch)) {
  2.     throw new RuntimeException('Curl error '. curl_errno($ch) . ': ' .curl_error($ch));
  3. }


-----
PostgreSQL DBA
 
 Top
catanginus
Отправлено: 28 Февраля, 2019 - 11:45:52
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




 
 Top
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 11:48:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Мелкий пишет:
Vladimir Kheifets пишет:
return $httpCode==200?$data:$httpCode;

И как понимать, что же ответил сервер?

Ну и заодно замечу, что после curl_exec необходимо проверять чем завершился сам curl_exec:
PHP:
скопировать код в буфер обмена
  1. if (curl_errno($ch)) {
  2.     throw new RuntimeException('Curl error '. curl_errno($ch) . ': ' .curl_error($ch));
  3. }

Понимать так, если $httpCode==200, то функция возвращает string $data (контент сайта) - иначе, как в данном случае, 403, это ошибка, возвращает integer
Конечно, можно "бурить" глубже с RuntimeException, но работает и так как я показал.
Для $url="http://r91933pi.beget.tech/"; результат:
Цитата:
html Error: 403

Меду прочим , если мы посмотрим, .curl_errno($ch)
PHP:
скопировать код в буфер обмена
  1. function file_get_contents_curl($url)
  2. {
  3.     $ch=curl_init();
  4.     curl_setopt($ch,CURLOPT_HEADER,0);
  5.     curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  6.     curl_setopt($ch, CURLOPT_ENCODING, "");
  7.     curl_setopt($ch,CURLOPT_URL,$url);
  8.     curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
  9.     $data=curl_exec($ch);
  10.     echo "47: curl_errno:".curl_errno($ch)."<br>";
  11.     if (curl_errno($ch))
  12.         {
  13.         throw new RuntimeException('Curl error '. curl_errno($ch) . ': ' .curl_error($ch));
  14.         }
  15.     $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  16.     curl_close($ch);
  17.     return $httpCode==200?$data:$httpCode;
  18. }
, то в данном случае получим:
Цитата:
47: curl_errno:0
html Error: 403

(Отредактировано автором: 28 Февраля, 2019 - 12:06:35)

 
 Top
Мелкий Супермодератор
Отправлено: 28 Февраля, 2019 - 12:22:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Что ж, ок, вы не поняли мой вопрос. Совет на досуге прочесть Совершенный код Макконнелла и чистый код Роберта Мартина. Возвращать принципиально разные данные по собственному усмотрению функции - идея плохая.

Vladimir Kheifets пишет:
Меду прочим , если мы посмотрим, .curl_errno($ch)

Всё верно. Так и задумано. HTTP 403 - это корректно выполненный HTTP запрос.
А например на L3 ошибку No route to host или ошибку того же DNS вы иначе получите что-нибудь неожиданное чего в HTTP быть не может.


-----
PostgreSQL DBA
 
 Top
catanginus
Отправлено: 28 Февраля, 2019 - 12:59:56
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019  


Помог: 0 раз(а)




Я в курлах не бельмеса
но ясно только одно что документ не готов
не загрузился значит
а еще он по ходу загрузки подгружается етим курлом

если другой сайт грузить в дом все работает


вот тут обсуждается что то подобное
http://qaru[dot]site/questions/49965[dot][dot][dot]-loaded-one-time


нужно решение для своего же контента

(Отредактировано автором: 28 Февраля, 2019 - 13:04:05)

 
 Top
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 13:38:29
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


Помог: 37 раз(а)




Мелкий пишет:
Что ж, ок, вы не поняли мой вопрос. Совет на досуге прочесть Совершенный код Макконнелла и чистый код Роберта Мартина. Возвращать принципиально разные данные по собственному усмотрению функции - идея плохая.

Vladimir Kheifets пишет:
Меду прочим , если мы посмотрим, .curl_errno($ch)

Всё верно. Так и задумано. HTTP 403 - это корректно выполненный HTTP запрос.
А например на L3 ошибку No route to host или ошибку того же DNS вы иначе получите что-нибудь неожиданное чего в HTTP быть не может.

с досугом у меня не очень...
Если результат этого корректно выполненный HTTP запроса
Отравить в $dom->loadHTML($html); то получим:
Спойлер (Отобразить)
и ошибку в foreach ($dom->documentElement->childNodes as $node)

(Отредактировано автором: 28 Февраля, 2019 - 13:40:19)

 
 Top
Строитель Модератор
Отправлено: 28 Февраля, 2019 - 13:44:05
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Мелкий пишет:
после curl_exec необходимо проверять чем завершился сам curl_exec:
PHP:
скопировать код в буфер обмена
  1. if (curl_errno($ch)) {
  2.     throw new RuntimeException('Curl error '. curl_errno($ch) . ': ' .curl_error($ch));
  3. }
Полезно, спасибо )
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB