Получить DIV-контент с внешнего веб-сайта

Я хочу получить DIV с внешнего веб-сайта с чистым PHP.

Внешний веб-сайт: http://www.isitdownrightnow.com/youtube.com.html.

Текст Div, который я хочу получить от isitdownrightnow (statusup div): <div class="statusup">The website is probably down just for you...</div>

Я уже пробовал file_get_contents с DOMDocument и str_get_html, но не смог заставить его работать.

Например это

$page = file_get_contents('http://css-tricks.com/forums/topic/jquery-selector-div-variable/');
    $doc = new DOMDocument();
    $doc->loadHTML($page);
    $divs = $doc->getElementsByTagName('div');
    foreach($divs as $div) {
        // Loop through the DIVs looking for one withan id of "content"
        // Then echo out its contents (pardon the pun)
        if ($div->getAttribute('class') === 'bbp-template-notice') {
             echo $div->nodeValue;
        }
    }

Он просто отобразит ошибку в консоли:

Не удалось загрузить ресурс: сервер ответил статусом 500 (внутренняя ошибка сервера)


person Kallewallex    schedule 07.12.2013    source источник
comment
ну, он должен загружаться ... так что я предполагаю, что он динамически генерируется с помощью JS ... что очень затрудняет   -  person markasoftware    schedule 08.12.2013
comment
Если вы пробовали file_get_contents и др., Покажите свой код и объясните, что не сработало.   -  person Mike    schedule 08.12.2013
comment
@Markasoftware, почему это может быть очень сложно? requestable.pieterhordijk.com/cBg2b   -  person PeeHaa    schedule 08.12.2013
comment
@OP вам действительно нужно показать нам, в чем конкретно ваша проблема, иначе вам ничто не поможет. Я не мог заставить его работать. не является действительным описанием проблемы.   -  person PeeHaa    schedule 08.12.2013
comment
Вы можете свернуть страницу, сохранить ее содержимое, загрузить содержимое в объект DOMDocument и пройти по дереву с помощью DOMXPath.   -  person Darragh Enright    schedule 08.12.2013
comment
@PeeHaa, который предназначен для другого URL-адреса. Если он это сделает, это сработает, но точный URL в вопросе не изменится.   -  person markasoftware    schedule 08.12.2013
comment
OP не говорит, что хочет использовать этот URI. Он просто хочет результата.   -  person PeeHaa    schedule 08.12.2013
comment
Спасибо, ребята, что ответили. На самом деле я просто выбрал этот сайт в качестве примера, так как у меня самого нет ничего в сети. Это также может быть любой другой сайт, даже простой файл HTML. @PeeHaa Я удалил его, потому что у меня был большой беспорядок, в основном, если бы я повторил свой результат, он был просто пустым.   -  person Kallewallex    schedule 08.12.2013
comment
Вам все равно нужно сообщить нам о своей проблеме ... По теме: sscce.org   -  person PeeHaa    schedule 08.12.2013
comment
Да, дайте мне минутку, я воспроизведу и обновлю пост   -  person Kallewallex    schedule 08.12.2013
comment
Проверьте журнал ошибок, чтобы узнать, почему он выдает ошибку 500.   -  person PeeHaa    schedule 08.12.2013
comment
Элемент, который вы пытаетесь получить, на самом деле перезагружается с помощью вызова ajax (isitdownrightnow.com /check.php?domain=youtube.com), так что это бессмысленно для этого URL.   -  person worenga    schedule 08.12.2013
comment
@mightyuhu, а как насчет второго добавленного мной (css-tricks.com) ... это может быть любой URL. Я не работаю над проектом или чем-то в этом роде. Просто пытаюсь немного узнать php   -  person Kallewallex    schedule 08.12.2013
comment
У меня работает (phpfiddle.org/main/code/8i4-0vb), проверьте конфигурация вашего сервера.   -  person worenga    schedule 08.12.2013
comment
обновить ссылку phpfiddle.org/main/code/278-fki Если вы получите сообщение об ошибке 500 при запуске вашего скрипта, ваша конфигурация display_error должна быть скорректирована, см. php.net/ manual / en / errorfunc.configuration.php   -  person worenga    schedule 08.12.2013


Ответы (4)


Вот что я всегда использую:

$url = 'https://somedomain.com/somesite/';
$content = file_get_contents($url);
$first_step = explode( '<div id="thediv">' , $content );
$second_step = explode("</div>" , $first_step[1] );

echo $second_step[0];
person FlyingLemon    schedule 20.12.2013
comment
Это работает для меня на некоторых сайтах. Однако на сайте, который я пытаюсь получить, это не работает ... Есть идеи? - person Kallewallex; 21.12.2013
comment
Я не могу сказать без домена. Но возможно, что контент, который вы пытаетесь получить, не создается при использовании этого вместо посещения домена. Вы можете поэкспериментировать, используя HTTP-клиент / отладчик. Я использую Paw http. Просто попробуйте запрос и измените информацию в заголовке. Затем вы можете увидеть результат и проверить, отображается ли ваш контент div. - person FlyingLemon; 21.12.2013
comment
Наконец-то. Хорошо. Я попробовал. Он отображает только div, если я изменяю заголовок. Большое спасибо. - person Kallewallex; 21.12.2013
comment
Есть много способов сделать это лучше, чем манипуляции со строками. Если они добавят новый класс в этот HTML или внесут какие-либо незначительные изменения, вы облажались. Попробуйте goutte github.com/FriendsOfPHP/Goutte - person Phil Sturgeon; 19.12.2014
comment
все в порядке, но как насчет дочернего контента, если у них есть несколько div, а также несколько closign div (код правильный, но только для одного div) - person Hiren Kubavat; 25.06.2015

Это может быть немного излишним, но вы уловите суть.

<?php 

$doc = new DOMDocument;

// We don't want to bother with white spaces
$doc->preserveWhiteSpace = false;

// Most HTML Developers are chimps and produce invalid markup...
$doc->strictErrorChecking = false;
$doc->recover = true;

$doc->loadHTMLFile('http://www.isitdownrightnow.com/check.php?domain=youtube.com');

$xpath = new DOMXPath($doc);

$query = "//div[@class='statusup']";

$entries = $xpath->query($query);
var_dump($entries->item(0)->textContent);

?>
person worenga    schedule 07.12.2013
comment
Это действительно работает. Потрясающие. Как мне получить его без строки (XX) и просто получить текст в переменной? - person Kallewallex; 08.12.2013
comment
измените var_dump на назначение типа $var = $entries->item(0)->textContent - person worenga; 08.12.2013
comment
Большое тебе спасибо. Это сделало это. Я поигрался с ним ..... но у меня действительно проблемы с его использованием на других сайтах, иногда он работает, иногда нет. Например, я пытаюсь получить div <h2 id="place-one" class="success">Yes.</h2>, но использование "//h2[@class='success']"; не помогло. - person Kallewallex; 08.12.2013
comment
Трудно сказать без каких-либо дополнительных сведений о конкретном URL-адресе. - person worenga; 08.12.2013
comment
$var = $xpath->evaluate('string(//div[@class="startup"])'); вернет текстовое содержимое непосредственно в виде строки. - person ThW; 08.12.2013
comment
Он работает нормально, но при его использовании я получаю много предупреждений: htmlParseEntityRef: expecting ';', ID ... уже определен в ..., htmlParseEntityRef: no name и Unexpected end tag - есть ли обходной путь для этого без отключения сообщения об ошибках? - person user2718671; 19.08.2014
comment
см. stackoverflow.com/questions/1148928/ - person worenga; 20.08.2014
comment
@worenga, как получить здесь значения от всех элементов (0) до значений элемента ([последний])? - person Mr. Bhosale; 24.04.2017

Я использовал метод xpath, предложенный @mightyuhu, и он отлично работал с его добавлением задания. В зависимости от веб-страницы, с которой вы получаете информацию, и наличия идентификатора или класса, который идентифицирует тег, который вы хотите получить, вам придется изменить используемый запрос. Если тегу присвоен идентификатор 'id', вы можете использовать его (образец предназначен для извлечения обменного курса доллара США):

$query = "//div[@id='USD']";

Однако разработчики сайта не упростят нам задачу, поэтому в моем примере будет еще несколько «безымянных» тегов:

<div id="USD" class="tab">
  <table cellspacing="0" cellpadding="0">
    <tbody>
     <tr>
        <td>Ask Rate</td>
        <td align="right">1.77400</td>
     </tr>
     <tr class="even">
        <td>Bid Rate</td>
        <td align="right">1.70370</td>
     </tr>
     <tr>
        <td>BNB Fixing</td>
        <td align="right">1.735740</td>
     </tr>
   </tbody>
  </table>
</div>

Поэтому мне пришлось изменить запрос, чтобы получить «Ask Rate»:

$doc->loadHTMLFile('http://www.fibank.bg/en');
$xpath = new DOMXPath($doc);
$query = "//div[@id='USD']/table/tbody/tr/td";

Итак, я использовал запрос выше, но изменил item на 1 вместо 0, чтобы получить второй столбец, где указан обменный курс (первый столбец содержит текст «Ask Rate»):

$entries = $xpath->query($query);
$usdrate = $entries->item(1)->textContent;

Другой метод - ссылаться на значение непосредственно в запросе, который, когда у вас нет имен или стилей, должен выполняться с помощью индексации тегов, что я получил в качестве знания от моего браузера Maxthon и его функции «Проверить элемент» в сочетании с пункт меню "Копировать XPath" справа (аккуратно, да?):

"//*[@id="USD"]/table/tbody/tr[1]/td[2]"

Обратите внимание, что он также вставляет звездочку (*) после //, в которой я не копался. В этом случае вы должны снова получить значение с item(0), поскольку других значений не будет.

При необходимости вы можете внести любые изменения в извлеченную строку, например изменить числовой формат в соответствии с вашими предпочтениями:

$usdrate = number_format($usdrate, 5, ',', ' ');

Я надеюсь, что кто-то сочтет это полезным, поскольку я нашел ответы выше, и сэкономлю этому кому-то время на поиск правильного запроса и синтаксиса.

person Boyan Alexiev    schedule 28.08.2015

person    schedule
comment
Почему вы используете fopen / fwrite / require_once? Также; дублируете принятый ответ ..? - person Sjon; 21.09.2015
comment
Спасибо за ответ на этот вопрос! Ответы только на код не приветствуются в Stack Overflow, потому что исходному постеру (или будущим читателям) может быть сложно понять логику, стоящую за ними. Пожалуйста, отредактируйте свой вопрос и включите объяснение своего кода, чтобы другие могли извлечь выгоду из вашего ответа. Спасибо! - person Maximillian Laumeister; 22.09.2015