PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
catanginus
Отправлено: 23 Февраля, 2019 - 22:36:32
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019
Помог: 0 раз(а)
Здравствуйте,
как правильно получить содержимое страницы
PHP:
скопировать код в буфер обмена
echo " <a href='index.php?id=3'>Авторизация</a>" ;
echo "<div id=12>!!!!!!</div>" ;
dom = new DOMDocument;
$dom -> loadHTML ( $url ) ;
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo $node -> nodeName ;
echo '<br>....<br>' ;
}
поучаю body а то что отправлено
echo " <a href='index.php?id=3'>Авторизация</a>";
echo "<div id=12>!!!!!!</div>";
нету
почему подскажите пожалуйста?
Vladimir Kheifets
Отправлено: 24 Февраля, 2019 - 09:52:42
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
catanginus пишет: Здравствуйте,
как правильно получить содержимое страницы
Добрый день!
Видимо Вы хотели бы не получить содержимое, а спарсить html-страницу.
Примерно так:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?PHP
header ( "Content-Type: text/html; charset=utf-8" ) ; $url = "http://www.php.su/" ;
$html = file_get_contents_curl( $url ) ;
$dom = new DOMDocument( ) ;
@ $dom -> loadHTML ( $html ) ;
//echo "<pre>";var_dump($dom);echo "</pre>";
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo "node:" , $node -> nodeName , "<br>" ;
if ( $node -> childNodes )
{
foreach ( $node -> childNodes as $node2 )
{
echo "node2:" , $node2 -> nodeName , "<br>" ;
if ( $node2 -> childNodes )
{
foreach ( $node2 -> childNodes as $node3 )
{
echo "node3:" , $node2 -> nodeName , "<br>" ;
echo "<pre>" ; var_dump( $node3 ) ; echo "</pre>" ;
}
}
}
}
}
#####################################################
function file_get_contents_curl( $url )
{
return $data ;
}
?>
Фрагмент результата:Спойлер (Отобразить ) node:head
node2:title
node3:title
object(DOMText)#11 (19) {
["wholeText"]=>
string(54) "PHP, MySQL и другие веб-технологии"
["data"]=>
string(54) "PHP, MySQL и другие веб-технологии"
["length"]=>
int(34)
["nodeName"]=>
string(5) "#text"
["nodeValue"]=>
string(54) "PHP, MySQL и другие веб-технологии"
["nodeType"]=>
int(3)
["parentNode"]=>
string(22) "(object value omitted)"
["childNodes"]=>
NULL
["firstChild"]=>
NULL
["lastChild"]=>
NULL
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
string(22) "(object value omitted)"
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(54) "PHP, MySQL и другие веб-технологии"
}
node2:meta
node2:meta
node2:meta
......................
......................
Удачи!(Отредактировано автором: 24 Февраля, 2019 - 09:55:09)
Vladimir Kheifets
Отправлено: 24 Февраля, 2019 - 14:54:03
Частый посетитель
Покинул форум
Сообщений всего: 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)
catanginus
Отправлено: 24 Февраля, 2019 - 16:57:15
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019
Помог: 0 раз(а)
Я только не могу понять почему dom не работает
то же самое принципе
PHP:
скопировать код в буфер обмена
echo " <a href='index.php?id=3'>Авторизация</a>" ;
echo "<div id=12>!!!!!!</div>" ;
$dom = new DOMDocument;
$dom -> loadHTML ( $url ) ;
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo "node:" , $node -> nodeName , "<br>" ;
if ( $node -> childNodes )
{
foreach ( $node -> childNodes as $node2 )
{
echo "node2:" , $node2 -> nodeName , "<br>" ;
}
}
}
и не работает
параграф какой-то откуда то берёт(Отредактировано автором: 24 Февраля, 2019 - 16:59:15)
Vladimir Kheifets
Отправлено: 25 Февраля, 2019 - 07:30:17
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
catanginus пишет: Я только не могу понять почему dom не работает
то же самое принципе
PHP:
скопировать код в буфер обмена
echo " <a href='index.php?id=3'>Авторизация</a>" ;
echo "<div id=12>!!!!!!</div>" ;
$dom = new DOMDocument;
$dom -> loadHTML ( $url ) ;
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo "node:" , $node -> nodeName , "<br>" ;
if ( $node -> childNodes )
{
foreach ( $node -> childNodes as $node2 )
{
echo "node2:" , $node2 -> nodeName , "<br>" ;
}
}
}
и не работает
параграф какой-то откуда то берёт
Добрый день!
У Вас в коде не видно как опредяляется значение переменной $url в $dom->loadHTML($url);
В ней доджна быть:
Цитата: public DOMDocument::loadHTML( string $source[, int $options = 0] ) : bool
Не работет потому, что ,вероятно, туда не попал контент сайта.
Определим значение переменной $url:
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?PHP
header ( "Content-Type: text/html; charset=utf-8" ) ; $url = <<<EOM
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Демо</title>
</head>
<body>
<a href='index.php?id=3'>Авторизация</a>
<div id=12>!!!!!!</div>
</body>
</html>
EOM ;
$dom = new DOMDocument( ) ;
@ $dom -> loadHTML ( $url ) ;
//echo "<pre>";var_dump($dom);echo "</pre>";
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo "node:" , $node -> nodeName , "<br>" ;
if ( $node -> childNodes )
{
foreach ( $node -> childNodes as $node2 )
{
echo "node2:" , $node2 -> nodeName , "<br>" ;
if ( $node2 -> childNodes )
{
foreach ( $node2 -> childNodes as $node3 )
{
echo "node3:" , $node2 -> nodeName , "<br>" ;
echo "<pre>" ; var_dump( $node3 ) ; echo "</pre>" ;
}
}
}
}
}
?>
И получим:Спойлер (Отобразить ) Цитата: node:head
node2:meta
node2:title
node3:title
object(DOMText)#11 (19) {
["wholeText"]=>
string(8) "Демо"
["data"]=>
string(8) "Демо"
["length"]=>
int(4)
["nodeName"]=>
string(5) "#text"
["nodeValue"]=>
string(8) "Демо"
["nodeType"]=>
int(3)
["parentNode"]=>
string(22) "(object value omitted)"
["childNodes"]=>
NULL
["firstChild"]=>
NULL
["lastChild"]=>
NULL
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
string(22) "(object value omitted)"
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(8) "Демо"
}
node:body
node2:#text
node2:a
node3:a
object(DOMText)#12 (19) {
["wholeText"]=>
string(22) "Авторизация"
["data"]=>
string(22) "Авторизация"
["length"]=>
int(11)
["nodeName"]=>
string(5) "#text"
["nodeValue"]=>
string(22) "Авторизация"
["nodeType"]=>
int(3)
["parentNode"]=>
string(22) "(object value omitted)"
["childNodes"]=>
NULL
["firstChild"]=>
NULL
["lastChild"]=>
NULL
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
string(22) "(object value omitted)"
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(22) "Авторизация"
}
node2:#text
node2:div
node3:div
object(DOMText)#11 (19) {
["wholeText"]=>
string(6) "!!!!!!"
["data"]=>
string(6) "!!!!!!"
["length"]=>
int(6)
["nodeName"]=>
string(5) "#text"
["nodeValue"]=>
string(6) "!!!!!!"
["nodeType"]=>
int(3)
["parentNode"]=>
string(22) "(object value omitted)"
["childNodes"]=>
NULL
["firstChild"]=>
NULL
["lastChild"]=>
NULL
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
string(22) "(object value omitted)"
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(6) "!!!!!!"
}
node2:#text
Удачи!(Отредактировано автором: 25 Февраля, 2019 - 07:44:50)
catanginus
Отправлено: 27 Февраля, 2019 - 23:03:18
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019
Помог: 0 раз(а)
точно что контент не попадант но
вот url
$url="http://r91933pi.beget.tech/";
но все равно curl этот то работает то нет да еще и долго так не нормально
может от того что у меня линукс?
а dom
не поучает что на сайте
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
echo " <a href='index.php?id=3'>Авторизация</a>" ;
echo "<div id=12>!!!!!!</div>" ;
$url = "http://r91933pi.beget.tech/" ;
$html = file_get_contents_curl( $url ) ;
$dom = new DOMDocument( ) ;
$dom -> loadHTML ( $html ) ;
//$dom->saveHTML();
$str = '1' ;
$i = 0 ;
function node( $n , $str , $i )
{
foreach ( $n as $node )
{
$str .= $node -> nodeName ;
if ( $node -> childNodes )
{
$i = $i + 1 ;
$str .= ' ' . node( $node -> childNodes , $str , $i ) . ' <br> ' . $i ;
if ( $i == 30) { break ; /* на случай ошибки */ }
}
}
return $str ;
}
$r = node( $dom -> documentElement -> childNodes , $str , $i ) ;
echo $r ;
//#####################################################
function file_get_contents_curl( $url )
{
return $data ;
}
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 07:51:48
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
catanginus пишет: точно что контент не попадант но
вот url
$url="http://r91933pi.beget.tech/";
но все равно curl этот то работает то нет да еще и долго так не нормально
может от того что у меня линукс?
а dom
не поучает что на сайте
CODE (
htmlphp ):
скопировать код в буфер обмена
<? php
echo " <a href='index.php?id=3'>Авторизация</a>" ;
echo "<div id=12>!!!!!!</div>" ;
$url = "http://r91933pi.beget.tech/" ;
$html = file_get_contents_curl( $url ) ;
$dom = new DOMDocument( ) ;
$dom -> loadHTML ( $html ) ;
//$dom->saveHTML();
$str = '1' ;
$i = 0 ;
function node( $n , $str , $i )
{
foreach ( $n as $node )
{
$str .= $node -> nodeName ;
if ( $node -> childNodes )
{
$i = $i + 1 ;
$str .= ' ' . node( $node -> childNodes , $str , $i ) . ' <br> ' . $i ;
if ( $i == 30) { break ; /* на случай ошибки */ }
}
}
return $str ;
}
$r = node( $dom -> documentElement -> childNodes , $str , $i ) ;
echo $r ;
//#####################################################
function file_get_contents_curl( $url )
{
return $data ;
}
Добрый день!
curl этот работает
Добавьте, пожалуйста, в 13 строку: и Вы увидите , что страница, которую Вы хотите парзить выдаёт 403 ошибку:Спойлер (Отобразить ) Цитата: object(DOMDocument)#1 (35) {
["doctype"]=>
string(22) "(object value omitted)"
["implementation"]=>
string(22) "(object value omitted)"
["documentElement"]=>
string(22) "(object value omitted)"
["actualEncoding"]=>
NULL
["encoding"]=>
NULL
["xmlEncoding"]=>
NULL
["standalone"]=>
bool(true)
["xmlStandalone"]=>
bool(true)
["version"]=>
NULL
["xmlVersion"]=>
NULL
["strictErrorChecking"]=>
bool(true)
["documentURI"]=>
NULL
["config"]=>
NULL
["formatOutput"]=>
bool(false)
["validateOnParse"]=>
bool(false)
["resolveExternals"]=>
bool(false)
["preserveWhiteSpace"]=>
bool(true)
["recover"]=>
bool(false)
["substituteEntities"]=>
bool(false)
["nodeName"]=>
string(9) "#document"
["nodeValue"]=>
NULL
["nodeType"]=>
int(13)
["parentNode"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
string(22) "(object value omitted)"
["lastChild"]=>
string(22) "(object value omitted)"
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
NULL
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(54) "403 Forbidden
403 Forbidden
nginx-reuseport/1.13.4
"
}
Добавил пару строк в function file_get_contents_curl :Добавьте, пожалуйста, проверку в Ваш код:Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?PHP
header ( "Content-Type: text/html; charset=utf-8" ) ; $url = "http://r91933pi.beget.tech/" ;
$html = file_get_contents_curl( $url ) ;
{
echo "html Error: $html " ;
}
else
{
$dom = new DOMDocument( ) ;
@ $dom -> loadHTML ( $html ) ;
echo "<pre>" ; var_dump( $dom ) ; echo "</pre><hr>" ;
foreach ( $dom -> documentElement -> childNodes as $node )
{
echo "node:" , $node -> nodeName , "<br>" ;
if ( $node -> childNodes )
{
foreach ( $node -> childNodes as $node2 )
{
echo "node2:" , $node2 -> nodeName , "<br>" ;
if ( $node2 -> childNodes )
{
foreach ( $node2 -> childNodes as $node3 )
{
echo "node3:" , $node2 -> nodeName , "<br>" ;
echo "<pre>" ; var_dump( $node3 ) ; echo "</pre>" ;
}
}
}
}
}
}
Удачи!(Отредактировано автором: 28 Февраля, 2019 - 08:32:39)
Мелкий
Отправлено: 28 Февраля, 2019 - 10:37:29
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Vladimir Kheifets пишет: return $httpCode==200?$data:$httpCode;
И как понимать, что же ответил сервер?
Ну и заодно замечу, что после curl_exec необходимо проверять чем завершился сам curl_exec:
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 11:48:43
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
Мелкий пишет: Vladimir Kheifets пишет: return $httpCode==200?$data:$httpCode;
И как понимать, что же ответил сервер?
Ну и заодно замечу, что после curl_exec необходимо проверять чем завершился сам curl_exec:
Понимать так, если $httpCode==200, то функция возвращает string $data (контент сайта) - иначе, как в данном случае, 403, это ошибка, возвращает integer
Конечно, можно "бурить" глубже с RuntimeException, но работает и так как я показал.
Для $url="http://r91933pi.beget.tech/"; результат:
Меду прочим , если мы посмотрим, .curl_errno($ch)
, то в данном случае получим:Цитата: 47: curl_errno:0
html Error: 403
(Отредактировано автором: 28 Февраля, 2019 - 12:06:35)
Мелкий
Отправлено: 28 Февраля, 2019 - 12:22:50
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Что ж, ок, вы не поняли мой вопрос. Совет на досуге прочесть Совершенный код Макконнелла и чистый код Роберта Мартина. Возвращать принципиально разные данные по собственному усмотрению функции - идея плохая.
Vladimir Kheifets пишет: Меду прочим , если мы посмотрим, .curl_errno($ch)
Всё верно. Так и задумано. HTTP 403 - это корректно выполненный HTTP запрос.
А например на L3 ошибку No route to host или ошибку того же DNS вы иначе получите что-нибудь неожиданное чего в HTTP быть не может.
catanginus
Отправлено: 28 Февраля, 2019 - 12:59:56
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Февр. 2019
Помог: 0 раз(а)
Я в курлах не бельмеса
но ясно только одно что документ не готов
не загрузился значит
а еще он по ходу загрузки подгружается етим курлом
если другой сайт грузить в дом все работает
вот тут обсуждается что то подобное
http://qaru[dot]site/questions/49965[dot][dot][dot]-loaded-one-time
нужно решение для своего же контента
(Отредактировано автором: 28 Февраля, 2019 - 13:04:05)
Vladimir Kheifets
Отправлено: 28 Февраля, 2019 - 13:38:29
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
Мелкий пишет: Что ж, ок, вы не поняли мой вопрос. Совет на досуге прочесть Совершенный код Макконнелла и чистый код Роберта Мартина. Возвращать принципиально разные данные по собственному усмотрению функции - идея плохая.
Vladimir Kheifets пишет: Меду прочим , если мы посмотрим, .curl_errno($ch)
Всё верно. Так и задумано. HTTP 403 - это корректно выполненный HTTP запрос.
А например на L3 ошибку No route to host или ошибку того же DNS вы иначе получите что-нибудь неожиданное чего в HTTP быть не может.
с досугом у меня не очень...
Если результат этого корректно выполненный HTTP запроса
Отравить в
$dom->loadHTML($html); то получим:
Спойлер (Отобразить ) Цитата: object(DOMDocument)#1 (35) {
["doctype"]=>
string(22) "(object value omitted)"
["implementation"]=>
string(22) "(object value omitted)"
["documentElement"]=>
string(22) "(object value omitted)"
["actualEncoding"]=>
NULL
["encoding"]=>
NULL
["xmlEncoding"]=>
NULL
["standalone"]=>
bool(true)
["xmlStandalone"]=>
bool(true)
["version"]=>
NULL
["xmlVersion"]=>
NULL
["strictErrorChecking"]=>
bool(true)
["documentURI"]=>
NULL
["config"]=>
NULL
["formatOutput"]=>
bool(false)
["validateOnParse"]=>
bool(false)
["resolveExternals"]=>
bool(false)
["preserveWhiteSpace"]=>
bool(true)
["recover"]=>
bool(false)
["substituteEntities"]=>
bool(false)
["nodeName"]=>
string(9) "#document"
["nodeValue"]=>
NULL
["nodeType"]=>
int(13)
["parentNode"]=>
NULL
["childNodes"]=>
string(22) "(object value omitted)"
["firstChild"]=>
string(22) "(object value omitted)"
["lastChild"]=>
string(22) "(object value omitted)"
["previousSibling"]=>
NULL
["nextSibling"]=>
NULL
["attributes"]=>
NULL
["ownerDocument"]=>
NULL
["namespaceURI"]=>
NULL
["prefix"]=>
string(0) ""
["localName"]=>
NULL
["baseURI"]=>
NULL
["textContent"]=>
string(54) "403 Forbidden
403 Forbidden
nginx-reuseport/1.13.4
"
}
и ошибку в
foreach ($dom->documentElement->childNodes as $node) (Отредактировано автором: 28 Февраля, 2019 - 13:40:19)
Поиск в теме | Версия для печати
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB