0
    <?php

$file = 'http://www.google.com';
$doc = new DOMDocument();
@ $doc->loadHTML(file_get_contents($file));

echo $doc->getElementsByTagName('span')->item(2)->nodeValue;

if (0 != $element->length) 
{
    $content = trim($element->item(2)->nodeValue);
    if (empty($content)) 
    {
        $content = trim($element->item(2)->textContent);
    }
    echo $content . "\n";
}

?>

我试图从 google.com 的主页获取 span 标签的内部内容。这段代码应该输出第一个跨度标签,但它没有输出任何结果?

4

4 回答 4

4

这不是一个错误......第一个跨度http://www.google.com是空的,我不确定你还有什么期望

 <span class=gbtcb></span> <----------------  item(0)
 <span class=gbtb2></span> <----------------  item(1)
 <span class=gbts>Search</span> <-----------  item(2)

尝试

$element = $doc->getElementsByTagName('span')->item(2);
var_dump($element->nodeValue);

输出

Search
于 2012-11-25T18:28:35.277 回答
0

首先,请记住 HTML 不一定是有效的 XML。

除此之外,请检查您是否确实要解析一些内容;您需要allow_url_fopen启用才能file_get_contents()与 URL 一起使用。

一般来说,避免使用错误抑制运算符 (@),因为它几乎肯定会在一段时间内再次咬你(而这一次很可能就是那个时候);在 SO 的其他地方对此进行了讨论。

因此,作为第一步,切换到类似下面的内容,让我知道您是否收到任何内容。

// stop using @ to suppress errors
$contents = file_get_contents($file);
// check that you're getting something to parse
echo $contents;
于 2012-11-25T18:28:01.097 回答
0

试试这个并告诉我们输出是什么

<?
echo ini_get('allow_url_fopen');
?>
于 2012-11-25T18:40:37.230 回答
0

尝试使用 cURL 获取数据,然后将其加载到 DOMDocument 中:

<?php
$url = "http://www.google.com";
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);

$dom = new DOMDocument();
@$dom->loadHTML($data); //The @ is necessary to suppress invalid markup

echo $dom->getElementsByTagName('span')->item(2)->nodeValue;

if (0 != $element->length) 
{
    $content = trim($element->item(2)->nodeValue);
    if (empty($content)) 
    {
        $content = trim($element->item(2)->textContent);
    }
    echo $content . "\n";
}

?>
于 2012-11-25T19:10:06.857 回答