web-dev-qa-db-fra.com

Obtenez du contenu DIV à partir d'un site Web externe

Je veux obtenir un DIV à partir d'un site Web externe avec du PHP pur.

Site Web externe: http://www.isitdownrightnow.com/youtube.com.html

Texte de div que je veux de isitdownrightnow (statusup div): <div class="statusup">The website is probably down just for you...</div>

J'ai déjà essayé file_get_contents avec DOMDocument et str_get_html, mais je n'ai pas pu le faire fonctionner.

Par exemple ceci

$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;
        }
    }

Il affichera simplement une erreur dans la console:

Impossible de charger la ressource: le serveur a répondu avec un état de 500 (erreur interne du serveur)

15
Kallewallex

C'est ce que j'utilise toujours:

$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];
58
FlyingLemon

Cela peut être un peu exagéré, mais vous obtiendrez l'essentiel.

<?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);

?>
17
worenga

J'ai utilisé la méthode xpath proposée par @mightyuhu et cela a très bien fonctionné avec son ajout de l'affectation. Selon la page Web dont vous obtenez les informations et la disponibilité d'un "id" ou d'une "classe" qui identifie la balise que vous souhaitez obtenir, vous devrez modifier la requête que vous utilisez. Si le tag a un 'id' qui lui est assigné, vous pouvez l'utiliser (l'exemple est pour extraire le taux de change USD):

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

Cependant, les développeurs du site ne nous faciliteront pas la tâche, il y aura donc plusieurs autres balises "sans nom" dans lesquelles creuser, dans mon exemple:

<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>

J'ai donc dû modifier la requête pour obtenir le "taux de demande":

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

J'ai donc utilisé la requête ci-dessus, mais j'ai changé le item à 1 au lieu de 0 pour obtenir la deuxième colonne où se trouve le taux de change (la première colonne contient le texte 'Ask Rate'):

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

Une autre méthode consiste à référencer la valeur directement dans la requête, ce qui, lorsque vous n'avez pas de noms ou de styles, doit être effectué avec l'indexation des balises, ce que j'ai reçu en tant que connaissance de mon navigateur Maxthon et de sa fonctionnalité "Inspecter l'élément" combinée avec l'option de menu de droite "Copier XPath" (soignée, ouais?):

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

Notez qu'il insère également un astérisque (*) après le //, Dans lequel je n'ai pas creusé. Dans ce cas, vous devriez à nouveau obtenir la valeur avec item(0), car il n'y aura pas d'autres valeurs.

Si vous en avez besoin, vous pouvez apporter des modifications à la chaîne que vous avez extraite, par exemple en modifiant le format numérique pour correspondre à votre préférence:

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

J'espère que quelqu'un trouvera cela utile, comme j'ai trouvé les réponses ci-dessus, et épargnera du temps à cette personne pour rechercher la bonne requête et la bonne syntaxe.

3
Boyan Alexiev