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
Форумы портала PHP.SU :: Версия для печати :: как правильно получить содержимое страницы
Форумы портала PHP.SU » » Вопросы новичков » как правильно получить содержимое страницы

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

1. catanginus - 23 Февраля, 2019 - 22:36:32 - перейти к сообщению
Здравствуйте,
как правильно получить содержимое страницы

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>";
нету
почему подскажите пожалуйста?
2. Vladimir Kheifets - 24 Февраля, 2019 - 09:52:42 - перейти к сообщению
catanginus пишет:
Здравствуйте,
как правильно получить содержимое страницы

Добрый день!
Видимо Вы хотели бы не получить содержимое, а спарсить html-страницу.
Примерно так:
Спойлер (Отобразить)
Фрагмент результата:
Спойлер (Отобразить)
Удачи!
3. catanginus - 24 Февраля, 2019 - 11:29:18 - перейти к сообщению
спасибо так получается
а как сделать чтобы курлы ети не тормозили так? file_get_contents_curl($url)
4. Vladimir Kheifets - 24 Февраля, 2019 - 14:54:03 - перейти к сообщению
catanginus пишет:
спасибо так получается
а как сделать чтобы курлы ети не тормозили так? file_get_contents_curl($url)

Альтернатива функция file_get_contents, но говорят curl работает быстрее:
https://web-answers[dot]ru/php/php-f[dot][dot][dot]voditelnost[dot]html
5. catanginus - 24 Февраля, 2019 - 16:57:15 - перейти к сообщению
Я только не могу понять почему 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.  


и не работает
параграф какой-то откуда то берёт
6. Vladimir Kheifets - 25 Февраля, 2019 - 07:30:17 - перейти к сообщению
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:
Спойлер (Отобразить)
И получим:
Спойлер (Отобразить)
Удачи!
7. catanginus - 27 Февраля, 2019 - 23:03:18 - перейти к сообщению
точно что контент не попадант но
вот 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.  
8. Vladimir Kheifets - 28 Февраля, 2019 - 07:51:48 - перейти к сообщению
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. }
Добавьте, пожалуйста, проверку в Ваш код:
Спойлер (Отобразить)
Удачи!
9. Мелкий - 28 Февраля, 2019 - 10:37:29 - перейти к сообщению
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. }
10. catanginus - 28 Февраля, 2019 - 11:45:52 - перейти к сообщению
http://qaru[dot]site/questions/49965[dot][dot][dot]-loaded-one-time
11. Vladimir Kheifets - 28 Февраля, 2019 - 11:48:43 - перейти к сообщению
Мелкий пишет:
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
12. Мелкий - 28 Февраля, 2019 - 12:22:50 - перейти к сообщению
Что ж, ок, вы не поняли мой вопрос. Совет на досуге прочесть Совершенный код Макконнелла и чистый код Роберта Мартина. Возвращать принципиально разные данные по собственному усмотрению функции - идея плохая.

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

Всё верно. Так и задумано. HTTP 403 - это корректно выполненный HTTP запрос.
А например на L3 ошибку No route to host или ошибку того же DNS вы иначе получите что-нибудь неожиданное чего в HTTP быть не может.
13. catanginus - 28 Февраля, 2019 - 12:59:56 - перейти к сообщению
Я в курлах не бельмеса
но ясно только одно что документ не готов
не загрузился значит
а еще он по ходу загрузки подгружается етим курлом

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


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


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

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)
15. Строитель - 28 Февраля, 2019 - 13:44:05 - перейти к сообщению
Мелкий пишет:
после curl_exec необходимо проверять чем завершился сам curl_exec:
PHP:
скопировать код в буфер обмена
  1. if (curl_errno($ch)) {
  2.     throw new RuntimeException('Curl error '. curl_errno($ch) . ': ' .curl_error($ch));
  3. }
Полезно, спасибо )

 

Powered by ExBB FM 1.0 RC1