web-dev-qa-db-ja.com

外部WebサイトからDIVコンテンツを取得する

純粋なPHPを使用して外部WebサイトからDIVを取得したい。

外部ウェブサイト: http://www.isitdownrightnow.com/youtube.com.html

Isitdownrightnowから必要なDivテキスト(statusup div):<div class="statusup">The website is probably down just for you...</div>

すでにfile_get_contentsDOMDocumentstr_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(内部サーバーエラー)で応答しました

15
Kallewallex

これは私がいつも使用するものです:

$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

これは少しやり過ぎかもしれませんが、要点はわかります。

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

@mightyuhuによって提案されたxpathメソッドを使用し、彼が割り当てを追加することでうまく機能しました。情報を取得するWebページと、取得するタグを識別する「id」または「class」の可用性に応じて、使用するクエリを変更する必要があります。タグに「id」が割り当てられている場合、これを使用できます(サンプルはUSDの為替レートを抽出するためのものです)。

_$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を0ではなく1に変更して、為替レートがある2番目の列を取得しました(最初の列には「Ask Rate」というテキストが含まれています):

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

別の方法は、クエリ内で直接値を参照することです。名前またはスタイルがない場合は、タグのインデックス付けを行う必要があります。これは、Maxthonブラウザおよびその「Inspect element」機能「Copy XPath」右メニューオプション(ニート、ええ?):

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

_//_の後にアスタリスク(*)も挿入していることに注意してください。この場合、他の値はないため、item(0)を使用して値を再度取得する必要があります。

必要に応じて、抽出した文字列に変更を加えることができます。たとえば、好みに合わせて数値形式を変更できます。

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

上記の答えを見つけたので、誰かがこれを助けてくれることを望み、正しいクエリと構文を探す時間をこの誰かに与えてくれます。

3
Boyan Alexiev