我正在尝试从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经验的人有一些我可以尝试的额外技巧,那将非常感激。
答案 0 :(得分:0)
您使用的是javascript getElementById
和getElementsByTagName
,如果是,则问题
$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在他的评论中提出的问题!