$ doc-> getElementById('id'),$ doc-> getElementsByName('id')无效

时间:2012-10-18 11:41:47

标签: php

  

可能重复:
  PHP HTML DomDocument getElementById problems

我正在尝试从PHP中搜索Google搜索中的信息,并发现我可以毫无问题地阅读搜索网址,但从中获取任何内容都是一个完全不同的问题。在阅读了大量帖子和适用的PHP文档之后,我想出了以下内容

// get large panoramas of montana
$url = 'http://www.google.com/search?q=montana+panorama&tbm=isch&biw=1408&bih=409';
$html = file_get_contents($url);
// was getting tons of "entity parse" errors, so added
$html = htmlentities($html, ENT_COMPAT, 'UTF-8', true); // tried false as well

$doc = new DOMDocument();
//$doc->strictErrorChecking = false; // tried both true and false here, same result
$result = $doc->loadHTML($html);

//echo $doc->saveHTML(); this shows that the tags I'm looking for are in fact in $doc

if ($result === true)
{
    var_dump($result); // prints 'true'
    $tags = $doc->getElementById('center_col');
    $tags = $doc->getElementsByTagName('td');
    var_dump($tags); // previous 2 lines both print NULL
}

我已经验证了我正在寻找的ID和标签位于html中的error_log($ html)和已解析的doc中,带有$ doc-> SaveHTNL()。有谁看到我做错了什么?

编辑:

感谢所有人的帮助,但我已经使用DOMDocument打了一堵墙。任何文档或其他线程中的任何内容都不适用于Google图像查询。这是我试过的:

我看了@Jon链接尝试了那里的所有建议,查看了getElementByID文档并阅读了那里的所有评论。仍然得到空结果集。优于NULL,但不是很多。

我尝试了xpath技巧:

$xpath  = new DOMXPath($doc);
$ccol   = $xpath->query("//*[@id='center_col']");

同样的结果,一个空集。

我在读取文件后直接写了一个error_log($ html),文档中有一个doctype“”,所以不是那样。

我也看到用户“carl2088”说“从我的经验来看,如果你加载了一个HTML文档,getElementById似乎没有任何设置就可以正常工作”。不是谷歌图像查询的情况,它会出现。

绝望中,我试过

echo count(explode('center_col', $html)) 

看看是否因为某些奇怪的原因它在初始error_log($ html)之后消失了。它绝对存在,字符串分为4个块。

我查看了2012年8月25日编译的PHP版本(5.3.15),因此它不是一个太旧的版本,不支持getElementByID。

在昨天之前,我一直在使用一个非常丑陋的“爆炸”系列来获取信息,虽然它是可怕的代码,但它需要45分钟才能完成并且有效。

我真的想抛弃我的“爆炸”黑客,但是5小时没有成就,而45分钟可以获得有效的东西,这使得以正确的方式做事真的很难。

如果有其他有使用DOMDocument经验的人有一些我可以尝试的额外技巧,那将非常感激。

2 个答案:

答案 0 :(得分:0)

您使用的是javascript getElementByIdgetElementsByTagName,如果是,则问题

 $tags = $doc->getElementById('center_col');
    $tags = $doc->getElementsByTagName('td');

答案 1 :(得分:0)

在使用函数 $ doc-> getElementById之前,您需要使用 DOMDocument-> validate() DOMDocument-> validateOnParse 验证您的文档( 'center_col');

$doc->validateOnParse = true;
$doc->loadHTML($html);

stackoverflow: getelementbyid-problem

http://php.net/manual/de/domdocument.getelementbyid.php

这是@Jon在他的评论中提出的问题!