Php 从外部网站获取DIV内容

Php 从外部网站获取DIV内容,php,html,domdocument,Php,Html,Domdocument,我想从一个纯PHP的外部网站获得一个DIV 外部网站: 我想从isitdownrightnow(statusup Div)获得Div文本:网站可能只为你关闭了… 我已经用DOMDocument和str\u-get\u-html尝试了file\u-get\u-contents,但我无法让它工作 比如这个 $page = file_get_contents('http://css-tricks.com/forums/topic/jquery-selector-div-variable/');

我想从一个纯PHP的外部网站获得一个DIV

外部网站:

我想从isitdownrightnow(statusup Div)获得Div文本:
网站可能只为你关闭了…

我已经用
DOMDocument
str\u-get\u-html
尝试了
file\u-get\u-contents
,但我无法让它工作

比如这个

$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 (内部服务器错误)


这可能有点过分,但你会明白要点的

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

?>

这是我经常使用的:

$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];
$url='1!'https://somedomain.com/somesite/';
$content=file\u get\u contents($url);
$first_step=分解(“”,$content);
$second_step=explode(“,$first_step[1]);
echo$second_步骤[0];

我使用了@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>
因此,我使用了上面的查询,但将该项改为1而不是0,以获取汇率所在的第二列(第一列包含文本“Ask rate”):

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

请注意,它还在
/
后面插入了一个星号(*),我没有对其进行深入研究。在这种情况下,您应该再次获得
项(0)
的值,因为没有其他值

如果需要,可以对提取的字符串进行任何更改,例如更改数字格式以匹配您的首选项:

$usdrate = number_format($usdrate, 5, ',', ' ');
我希望有人会觉得这很有帮助,因为我找到了上面的答案,并希望有人能抽出时间来搜索正确的查询和语法。

$contents=file\u get\u contents($url);
$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'); 
$title=分解(“”,$contents); $title=分解(“,$title[1]); $fp=fopen(“s.php”,“w+”); fwrite($fp,“$title[0]”); fclose($fp); 需要_一次('s.php');
它必须加载…所以我猜它是用JS动态生成的…这使得它非常有用difficult@OP你真的需要告诉我们你有什么具体的问题,或者你无法得到帮助。“不是一个有效的问题描述。@PeeHaa这是一个不同的url。如果他这样做了,它会起作用,但问题中的确切url不会说他想使用该URI。他只是想知道结果谢谢你们的回答。实际上我只是选择这个网站作为例子,因为我自己在网上没有任何东西。它也可以是任何其他站点,甚至是一个简单的html文件@PeeHaa我删除了它,因为我变得非常混乱,如果我回应我的结果,它只是空白的。这确实有效。令人惊叹的。我如何在没有“字符串(XX)”的情况下获取它,而只获取var中的文本?将var_dump更改为一个赋值,如
$var=$entries->item(0)->textContent
非常感谢。成功了。我到处玩。。。。。但我真的很难在其他网站上使用它,有时有效有时无效。例如,我试图获取一个div
是。
但使用的是
“//h2[@class='success']”
不起作用。很难说没有关于特定url的任何进一步详细信息。
$var=$xpath->evaluate('string(//div[@class=“startup”])
将直接以字符串形式返回文本内容。它在某些网站上确实适用于我。然而,在网站上,我试图得到它不工作。。。知道吗?没有域名我就说不出来了。但是,您尝试获取的内容可能不是在使用它而不是访问域时生成的。您可以使用HTTP客户机/调试器进行实验。我正在使用pawhttp。只需尝试一个请求并更改标题信息。然后,您可以查看输出并检查是否显示了divs内容。可以我试过了。它仅在修改标题时显示div。非常感谢。有很多比字符串操作更好的方法。如果他们在HTML中添加了一个新类,或者做了一些小的调整,那么你就完蛋了。尝试goutte没问题,但是如果子内容有多个div,并且它也有多个closign div(代码正确,但仅适用于单个div),那么子内容又如何呢?为什么要使用fopen/fwrite/require_一次?也;您正在复制已接受的答案..?感谢您发布此问题的答案!在堆栈溢出时不鼓励只使用代码的答案,因为原始海报(或未来读者)可能很难理解它们背后的逻辑。请编辑您的问题并对代码进行解释,以便其他人可以从您的答案中获益。谢谢
"//*[@id="USD"]/table/tbody/tr[1]/td[2]"
$usdrate = number_format($usdrate, 5, ',', ' ');
$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');