Как найти в php код html

Here is two different, simple ways to get content from URL:

1) the first method

Enable Allow_url_include from your hosting (php.ini or somewhere)

<?php
$variableee = readfile("http://example.com/");
echo $variableee;
?> 

or

2)the second method

Enable php_curl, php_imap and php_openssl

<?php
// you can add anoother curl options too
// see here - http://php.net/manual/en/function.curl-setopt.php
function get_dataa($url) {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

$variableee = get_dataa('http://example.com');
echo $variableee;
?>

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given a webpage, for which we need to find its source code using PHP. For this, we are going to use the PHP htmlspecialchars() function which converts any predefined characters to their subsequent HTML entities.

    Example 1: Suppose we take a sample website that looks like the below image, let us see what output would the code produce for the same.

    HTML code:

    HTML

    <!DOCTYPE html>

    <html>

    <head>

        <meta charset="utf-8">

        <title>SAMPLE WEBSITE</title>

    </head>

    <body style="color: green;">

        <h1>This is a Sample website</h1>

        <p>

            In this article we will learn 

            how to extract a web page's 

            source code through PHP

        </p>

    </body>

    </html>

    Output:

    Output as source code contents:

    Now let us suppose the above website is hosted on a localhost, the code would fail to load the source code in such a case. The output produced would be something similar to this.

    Output:

    Warning: file(file:///D:/Html%20website/gfg%20sample%20website/index.html): Failed to open stream: No such file or directory in C:xampphtdocsprogramssource code.php on line 2

    Warning: foreach() argument must be of type array|object, bool given in C:xampphtdocsprogramssource code.php on line 3

    Example 2:

    Approach:

    • Store its elements into an array.
    • Traverse the array using a PHP programming loop.
    • Convert and print each character into its subsequent HTML entity.

    PHP code: Below is the implementation of the above approach.

    PHP

    <?php

    foreach ($source_code as $line_number => $last_line) {

        echo nl2br(htmlspecialchars($last_line) . "n");

    }

    ?>

    Output:

    Last Updated :
    08 Feb, 2021

    Like Article

    Save Article

    Время на прочтение
    3 мин

    Количество просмотров 144K

    Добрый день, уважаемые хабровчане. В данном посте речь пойдет о совместном проекте S. C. Chen и John Schlick под названием PHP Simple HTML DOM Parser (ссылки на sourceforge).

    Идея проекта — создать инструмент позволяющий работать с html кодом используя jQuery подобные селекторы. Оригинальная идея принадлежит Jose Solorzano’s и реализована для php четвертой версии. Данный же проект является более усовершенствованной версией базирующейся на php5+.

    В обзоре будут представлены краткие выдержки из официального мануала, а также пример реализации парсера для twitter. Справедливости ради, следует указать, что похожий пост уже присутствует на habrahabr, но на мой взгляд, содержит слишком малое количество информации. Кого заинтересовала данная тема, добро пожаловать под кат.

    Получение html кода страницы

    $html = file_get_html('http://habrahabr.ru/'); //работает и с https://
    

    Товарищ Fedcomp дал полезный комментарий насчет file_get_contents и 404 ответа. Оригинальный скрипт при запросе к 404 странице не возвращает ничего. Чтобы исправить ситуацию, я добавил проверку на get_headers. Доработанный скрипт можно взять тут.

    Поиск элемента по имени тега

    foreach($html->find('img') as $element) { //выборка всех тегов img на странице
           echo $element->src . '<br>'; // построчный вывод содержания всех найденных атрибутов src
    }
    

    Модификация html элементов

    $html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>'); // читаем html код из строки (file_get_html() - из файла)
    $html->find('div', 1)->class = 'bar'; // присвоить элементу div с порядковым номером 1 класс "bar"
    $html->find('div[id=hello]', 0)->innertext = 'foo'; // записать в элемент div с id="hello" текст foo
    
    echo $html; // выведет <div id="hello">foo</div><div id="world" class="bar">World</div>
    

    Получение текстового содержания элемента (plaintext)

    echo file_get_html('http://habrahabr.ru/')->plaintext; 
    

    Целью статьи не является предоставить исчерпывающую документацию по данному скрипту, подробное описание всех возможностей вы можете найти в официальном мануале, если у сообщества возникнет желание, я с удовольствием переведу весь мануал на русский язык, пока же приведу обещанный в начале статьи пример парсера для twitter.

    Пример парсера сообщений из twitter

    require_once 'simple_html_dom.php'; // библиотека для парсинга
                $username = 'habrahabr'; // Имя в twitter
                $maxpost = '5'; // к-во постов
                $html = file_get_html('https://twitter.com/' . $username);
                $i = '0';
                foreach ($html->find('li.expanding-stream-item') as $article) { //выбираем все li сообщений
                    $item['text'] = $article->find('p.js-tweet-text', 0)->innertext; // парсим текст сообщения в html формате
                    $item['time'] = $article->find('small.time', 0)->innertext; // парсим время в html формате
                    $articles[] = $item; // пишем в массив
                    $i++;
                    if ($i == $maxpost) break; // прерывание цикла
                }
    
    Вывод сообщений

                    for ($j = 0; $j < $maxpost; $j++) {
                        echo '<div class="twitter_message">';
                        echo '<p class="twitter_text">' . $articles[$j]['text'] . '</p>';
                        echo '<p class="twitter_time">' . $articles[$j]['time'] . '</p>';
                        echo '</div>';
                    }
    

    Благодарю за внимание. Надеюсь, получилось не очень тяжеловесно и легко для восприятия.

    Похожие библиотеки

    htmlSQL — спасибо Chesnovich
    Zend_Dom_Query — спасибо majesty
    phpQuery — спасибо theRavel
    QueryPath — спасибо ZonD80
    The DomCrawler(Symfony) — спасибо choor
    CDom — спасибо автору samally
    Небезызвестный XPath — спасибо за напоминание KAndy

    P.S.
    Хаброжитель Groove подсказал что подобные материалы уже были
    P.P.S.
    Постараюсь в свободное время собрать все библиотеки и составить сводные данные по производительности и приятности использования.

    1. Получение контента с помощью библиотеки SimpleHTMLDOM
    2. Получение контента с помощью cURL
    3. Продвинутый скрипт получения контента на PHP

    Парсер контента на языке PHP – это важный инструмент для веб-разработчиков, которые работают с различными источниками данных. Он позволяет извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов, а также обрабатывать ее в соответствии с заданными правилами.

    Одним из основных преимуществ парсера контента является возможность автоматизировать процесс получения и обработки данных, что позволяет сократить время выполнения задач и уменьшить вероятность ошибок.

    Для получения контента определённой страницы сайта есть простое решение с помощью собственной функции php — file_get_contents. Всё, что требуется это передать в функцию URL нужной страницы. 

    Получение контента с помощью библиотеки SimpleHTMLDOM

    Для более качественной работы функции лучше воспользоваться подключаемой библиотекой SimpleHTMLDOM. В simplehtmldom есть методы для удаленной загрузки страниц.  После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк:

    str_get_html(str) и file_get_html(url)

    Они  делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.

    str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.

    $html = str_get_html('html код');

    file_get_html – сама умеет загружать данные с удаленного URL или из локального файла

    $html = file_get_html('http://www.yandex.ru/'); 

    или

    $html = file_get_html('data/test.htm');

    К сожалению,  file_get_html загружает страницы обычным file_get_contents. Это значит если хостер, выставил в php.ini allow_url_fopen = false (т.е. запретил удаленно открывать файлы), то загрузить что-то удаленно, не получится. Да и серьезные веб сайты таким способом парсить не стоит, лучше использовать CURL с поддержкой proxy и ssl.

    $html = file_get_html('http://www.yandex.ru/');
    в результате, в  переменной $html будет объект типа simple_html_dom.

    При больших объемах данных, в библиотеке происходит утечка памяти. Поэтому после окончания одного цикла надо ее чистить.

    Делает это метод clear.

    К примеру грузим 5 раз сайт www.yandex.ru с разными поисковыми запросами

    PHP

    include 'simple_html_dom.php';
    
    $k = 5;
    while($k>0){
     $html = file_get_html('http://yandex.ru/yandsearch?text=hi'.$k.'&lr=11114'); // загружаем данные
     // как-то их обрабатываем
     $html->clear(); // подчищаем за собой
     unset($html);
     $k--;
    }

    Ниже приведен ещё один пример использования библиотеки Simple HTML DOM Parser для парсинга HTML-страницы и извлечения заголовков новостей:

    PHP

    // Подключаем библиотеку
    require_once('simple_html_dom.php');
    
    // Получаем содержимое страницы
    $html = file_get_html('http://example.com/news.html');
    
    // Ищем все заголовки новостей
    foreach($html->find('h2.news-title') as $title) {
        // Выводим текст заголовка
        echo $title->plaintext;
    }

    В этом примере мы используем библиотеку Simple HTML DOM Parser, которая предоставляет простой и удобный API для работы с HTML-документами. Сначала мы получаем содержимое страницы с помощью функции file_get_html(), затем находим все элементы с тегом h2 и классом news-title с помощью метода find(). Наконец, мы выводим текст каждого заголовка с помощью свойства plaintext.

    Получение контента с помощью cURL

    Неоспоримыми преимуществами в функционале пользуется библиотека или можно сказать модуль PHPcURL. Для полноценного контролируемого получения контента здесь есть множество разных доплнений. Это и практически полноценный эмулятор браузерного обращения к сайту, работа скрипта через proxy с приватной идентификацией и многое другое. Ниже показана функция получения контента с помощью cURL.

    PHP

    function curl($url, $postdata='', $cookie='', $proxy=''){
        $uagent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16";
        
        $ch = curl_init( $url );
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
        curl_setopt($ch, CURLOPT_HEADER, 0);           // возвращает заголовки
        @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
        curl_setopt($ch, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
        curl_setopt($ch, CURLOPT_USERAGENT, $uagent);  // useragent
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);        // таймаут ответа
        //curl_setopt($ch, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа
        if($proxy !=''){$mass_proxy= explode(':', $proxy, 4);
        curl_setopt($ch, CURLOPT_PROXY, $mass_proxy[0].':'.$mass_proxy[1]);}
        if($mass_proxy[2]!="" and $mass_proxy[3]!=""){
        curl_setopt($ch, CURLOPT_PROXYUSERPWD,$mass_proxy[2].':'.$mass_proxy[3]);}// если необходимо предоставить имя пользователя и пароль 'user:pass'
    
        if(!empty($postdata))
    	{
    		curl_setopt($ch, CURLOPT_POST, 1);
    		curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    	}
    	if(!empty($cookie))
    	{
    		//curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/2.txt');
    		//curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT'].'/2.txt');
    	}
    	$content = curl_exec( $ch );
    	$err     = curl_errno( $ch );
    	$errmsg  = curl_error( $ch );
    	$header  = curl_getinfo( $ch );
    	curl_close( $ch );
    
    	$header['errno']   = $err;
    	$header['errmsg']  = $errmsg;
    	$header['content'] = $content; 
    	return $header['content'];
    }

    Продвинутый скрипт получения контента на PHP

    Ещё один способ получения контента встроенными функциями php я нашёл на просторах интернета. Пока не использовал, но привожу здесь для полноты картины, так как это решение тоже заслуживает достойного внимания. Далее, как в ©Источнике:
    Полезными качествами, в данном контексте, будут возможность получения множества атрибутов запрашиваемого контента, а также возможность получения заголовка ответа сервера и времени выполнения запроса. Данная функция использует встроенные в PHP функции для работы с сокетами, которые предназначены для соединения клиента с сервером.

    PHP

    <?php
    function abi_get_url_object($url, $user_agent=null)
    {
      define('ABI_URL_STATUS_UNSUPPORTED', 100);
      define('ABI_URL_STATUS_OK', 200);
      define('ABI_URL_STATUS_REDIRECT_301', 301);
      define('ABI_URL_STATUS_REDIRECT_302', 302);
      define('ABI_URL_STATUS_NOT_FOUND', 404);
      define('MAX_REDIRECTS_NUM', 4);
      $TIME_START = explode(' ', microtime());
      $TRY_ID = 0;
      $URL_RESULT = false;
      do
      {
        //--- parse URL ---
        $URL_PARTS = @parse_url($url);
        if( !is_array($URL_PARTS))
        {
          break;
        };
        $URL_SCHEME = ( isset($URL_PARTS['scheme']))?$URL_PARTS['scheme']:'http';
        $URL_HOST = ( isset($URL_PARTS['host']))?$URL_PARTS['host']:'';
        $URL_PATH = ( isset($URL_PARTS['path']))?$URL_PARTS['path']:'/';
        $URL_PORT = ( isset($URL_PARTS['port']))?intval($URL_PARTS['port']):80;
        if( isset($URL_PARTS['query']) && $URL_PARTS['query']!='' )
        {
          $URL_PATH .= '?'.$URL_PARTS['query'];
        };
        $URL_PORT_REQUEST = ( $URL_PORT == 80 )?'':":$URL_PORT";
        //--- build GET request ---
        $USER_AGENT = ( $user_agent == null )?'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)':strval($user_agent);
        $GET_REQUEST = "GET $URL_PATH HTTP/1.0
    "
        ."Host: $URL_HOST$URL_PORT_REQUEST
    "
        ."Accept: text/plain
    "
        ."Accept-Encoding: identity
    "
        ."User-Agent: $USER_AGENT
    
    ";
        //--- open socket ---
        $SOCKET_TIME_OUT = 30;
        $SOCKET = @fsockopen($URL_HOST, $URL_PORT, $ERROR_NO, $ERROR_STR, $SOCKET_TIME_OUT);
        if( $SOCKET )
        {
         if( fputs($SOCKET, $GET_REQUEST))
         {
          socket_set_timeout($SOCKET, $SOCKET_TIME_OUT);
          //--- read header ---
          $header = '';
          $SOCKET_STATUS = socket_get_status($SOCKET);
          while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] )
          {
            $temp = fgets($SOCKET, 128);
            if( trim($temp) == '' ) break;
            $header .= $temp;
            $SOCKET_STATUS = socket_get_status($SOCKET);
          };
          //--- get server code ---
          if( preg_match('~HTTP/(d+.d+)s+(d+)s+(.*)s*
    ~si', $header, $res))
           $SERVER_CODE = $res[2];
          else
           break;
          if( $SERVER_CODE == ABI_URL_STATUS_OK )
          {
            //--- read content ---
            $content = '';
            $SOCKET_STATUS = socket_get_status($SOCKET);
            while( !feof($SOCKET) && !$SOCKET_STATUS['timed_out'] )
            {
              $content .= fgets($SOCKET, 1024*8);
              $SOCKET_STATUS = socket_get_status($SOCKET);
            };
            //--- time results ---
            $TIME_END = explode(' ', microtime());
            $TIME_TOTAL = ($TIME_END[0]+$TIME_END[1])-($TIME_START[0]+$TIME_START[1]);
            //--- output ---
            $URL_RESULT['header'] = $header;
            $URL_RESULT['content'] = $content;
            $URL_RESULT['time'] = $TIME_TOTAL;
            $URL_RESULT['description'] = '';
            $URL_RESULT['keywords'] = '';
            //--- title ---
            $URL_RESULT['title'] =( preg_match('~<title>(.*)</title>~U', $content, $res))?strval($res[1]):'';
            //--- meta tags ---
            if( preg_match_all('~<metas+names*=s*["']?([^"']+)["']?s+contents*=["']?([^"']+)["']?[^>]+>~', $content, $res, PREG_SET_ORDER) > 0 )
            {
             foreach($res as $meta)
              $URL_RESULT[strtolower($meta[1])] = $meta[2];
            };
          }
          elseif( $SERVER_CODE == ABI_URL_STATUS_REDIRECT_301 || $SERVER_CODE == ABI_URL_STATUS_REDIRECT_302 )
          {
            if( preg_match('~location:s*(.*?)
    ~si', $header, $res))
            {
             $REDIRECT_URL = rtrim($res[1]);
             $URL_PARTS = @parse_url($REDIRECT_URL);
             if( isset($URL_PARTS['scheme'])&& isset($URL_PARTS['host']))
              $url = $REDIRECT_URL;
             else
              $url = $URL_SCHEME.'://'.$URL_HOST.'/'.ltrim($REDIRECT_URL, '/');
            }
            else
            {
             break;
            };
          };
         };// GET request is OK
         fclose($SOCKET);
        }// socket open is OK
        else
        {
         break;
        };
        $TRY_ID++;
      }
      while( $TRY_ID <= MAX_REDIRECTS_NUM && $URL_RESULT === false );
      return $URL_RESULT;
    };
    ?>

    Итак, входящими параметрами являются: $url — строка, содержащая URL http-протокола, $user_agent — строка с любым юзер-агентом (если пропустить параметр или установить его в null — user_agent будет как в IE). Константа MAX_REDIRECTS_NUM устанавливает количество разрешенных редиректов (поддерживаются 301 и 302 редиректы).

    Теперь перейдем к примерам практического использования этой функции:

    PHP

    <?php
    $url = 'http://www.yahoo.com';
    $user_agent = 'MySuperBot 1.02';
    $URL_OBJ = abi_get_url_object($url, $user_agent);
    if( $URL_OBJ )
    {
      $CONTENT = $URL_OBJ['content'];
      $HEADER = $URL_OBJ['header'];
      $TITLE = $URL_OBJ['title'];
      $DESCRIPTION = $URL_OBJ['description'];
      $KEYWORDS = $URL_OBJ['keywords'];
      $TIME_REQUEST = $URL_OBJ['time'];
    }
    else
      print 'Запрашиваемая страница недоступна.';
    ?>

    Как видно из вышеприведенного примера, мы можем получить всю информацию по запрошенному URL. Кроме того, можно получить значения любого мета-тега. Для этого можно воспользоваться следующим кодом:

    PHP

    <?php
    preg_match ("/charset=(.*?)"/is", $CONTENT, $char);
    $charset=$char[1];
    ?>

    Заключение:

    Парсер контента на языке PHP – это важный инструмент для получения и обработки данных из различных источников. Благодаря мощным библиотекам и инструментам, разработчики могут легко и удобно извлекать нужную информацию из HTML-страниц, XML-файлов и других форматов.

    Дата публикации: 2019-04-26


    ТОП 10 случайных публикаций

    Я хочу получить HTML-код ссылки (веб-страницы) в PHP. Например, если ссылка

    то я хочу, чтобы HTML-код страницы был подан. Я хочу получить этот код HTML и сохранить его в переменной PHP.

    Если ваш PHP-сервер разрешает обертку url fopen, тогда самый простой способ:

    $html = file_get_contents('http://stackoverflow.com/questions/ask'); 

    Если вам нужно больше контроля, вы должны посмотреть на функции cURL :

     $c = curl_init('http://stackoverflow.com/questions/ask'); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); //curl_setopt(... other options you want...) $html = curl_exec($c); if (curl_error($c)) die(curl_error($c)); // Get the status code $status = curl_getinfo($c, CURLINFO_HTTP_CODE); curl_close($c); 

    Кроме того, если вы хотите каким-либо образом манипулировать извлеченной страницей, вам может понадобиться попробовать парсер php DOM. Я нахожу PHP Simple HTML DOM Parser очень простым в использовании.

    Простой способ: используйте file_get_contents() :

     $page = file_get_contents('http://stackoverflow.com/questions/ask'); 

    Обратите внимание, что allow_url_fopen должен быть true в php.ini чтобы иметь возможность использовать обертки fopen с поддержкой URL.

    Более продвинутый способ. Если вы не можете изменить свою конфигурацию PHP, allow_url_fopen по умолчанию false , и если ext / curl установлен, используйте библиотеку cURL для подключения к желаемой странице.

    вы можете использовать file_get_contents, если вы хотите сохранить источник как переменную, однако завиток лучше.

     $url = file_get_contents('http://example.com'); echo $url; 

    это решение отобразит веб-страницу на вашем сайте. Однако завиток – лучший вариант.

    Вот два разных простых способа получить контент из URL :

    1) первый метод

    Включите Allow_url_include с вашего хостинга (php.ini или где-нибудь)

     <?php $variableee = readfile("http://example.com/"); echo $variableee; ?> 

    или

    2) второй метод

    Включить php_curl, php_imap и php_openssl

     <?php // you can add anoother curl options too // see here - http://php.net/manual/en/function.curl-setopt.php function get_dataa($url) { $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $data = curl_exec($ch); curl_close($ch); return $data; } $variableee = get_dataa('http://example.com'); echo $variableee; ?> 

    Понравилась статья? Поделить с друзьями:

    Не пропустите также:

  • Как найти человека по ватсапу рядом
  • Как найти свою звезду онлайн бесплатно
  • Как найти поставщика гель лаков
  • Как найти в майнкрафт ведро
  • Как найти работа в иран

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии