从外部网站获取DIV内容

时间:2013-12-07 21:01:59

标签: php html domdocument

我想从纯PHP的外部网站获取DIV。

外部网站:http://www.isitdownrightnow.com/youtube.com.html

我想要的文字isitdownrightnow(statusup div):<div class="statusup">The website is probably down just for you...</div>

我已经使用file_get_contentsDOMDocument尝试了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   (内部服务器错误)

4 个答案:

答案 0 :(得分:57)

这就是我经常使用的:

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

答案 1 :(得分:17)

这可能有点矫枉过正,但你会明白这一点。

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

?>

答案 2 :(得分:3)

我使用了@mightyuhu提出的xpath方法,并且在添加任务时效果很好。根据您获取信息的网页以及标识您希望获得的标记的“ID”或“类”的可用性,您必须更改您使用的查询。如果标签分配了“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";

所以,我使用了上面的查询,但是将更改为1而不是0以获得汇率所在的第二列(第一列包含文本'Ask Rate'):

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

另一种方法是直接在查询中引用该值,当你没有名称或样式时,应该使用索引标记来完成,这是我从Maxthon浏览器及其“Inspect element”获得的知识。功能结合“复制XPath”右侧菜单选项(整洁,是吗?):

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

请注意,它还会在//之后插入一个星号(*),我还没有深入研究。在这种情况下,您应该再次使用item(0)获取值,因为没有其他值。

如果需要,您可以对提取的字符串进行任何更改,例如更改数字格式以符合您的偏好:

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

我希望有人会发现这有用,因为我找到了上面的答案,并且会花些时间来搜索正确的查询和语法。

答案 3 :(得分:-3)

$contents = file_get_contents($url); 

  $title = explode('<div class="entry-content">',$contents); 
  $title = explode("</div>",$title[1]); 

$fp = fopen ("s.php", "w+"); 
fwrite ($fp, "$title[0]"); 
fclose ($fp); 
require_once('s.php');