0

可能重复:
PHP HTML DomDocument getElementById 问题

我正在尝试从 PHP 中的 Google 搜索中提取信息,并发现我可以毫无问题地阅读搜索 url,但从中获取任何内容是一个完全不同的问题。在阅读了大量帖子和适用的 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
}

我已经通过error_log($html) 验证了我要查找的id 和标签在html 中,并且在$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 经验的人有一些我可以尝试的额外技巧,将不胜感激。

4

2 回答 2

0

你在使用javascript吗getElementByIdgetElementsByTagName如果是的话,这就是问题所在

 $tags = $doc->getElementById('center_col');
    $tags = $doc->getElementsByTagName('td');
于 2012-10-18T11:43:28.377 回答
0

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

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

stackoverflow:getelementbyid问题

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

这是@Jon 在他的评论中发布的问题!

于 2012-10-18T12:41:52.243 回答