【发布时间】:2015-07-26 22:40:53
【问题描述】:
我想抓取 Google 搜索结果..
如何在不定义绝对路径的情况下获取所有<div class="g">元素?
此模式//h3[@class="r"] 将获取所有h3 元素
此模式//div[@class="g"] 不返回任何内容
html
...
<div id="ires">
<ol>
<div class="srg">
<div class="g">
...
<h3 class="r"></h3>
...
</div>
<div class="g">
...
<h3 class="r"></h3>
...
</div>
</div>
</ol>
</div>
...
代码
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.google.dk/search?q='.urlencode($query).'&start=0&num=100');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
libxml_use_internal_errors(true);
$doc = new DOMDocument('1.0', 'utf-8');
$doc->validateOnParse = false;
$doc->standalone = true;
$doc->preserveWhiteSpace = true;
$doc->strictErrorChecking = false;
$doc->substituteEntities = false;
$doc->recover = true;
$doc->formatOutput = true;
$doc->loadHTML($html);
libxml_clear_errors();
$div = $doc->getElementById('ires');
$xpath = new DOMXPath($doc);
foreach($xpath->query('//div[@class="g"]', $div) as $node){
print_r($node);
}
【问题讨论】:
-
您已经包含了一个简洁的示例和测试代码,这是一个好的开始。但是您实际上并没有解释运行此代码时当前发生的情况,以及您希望发生的情况。你有错误吗?是否显示了您不想要的元素?是否缺少您预期的输出?
-
没有输出。我需要查询模式来获取所有
<div class="g">元素,如问题中所述 -
那么你的问题应该解释一下。点击edit并添加尽可能多的细节;我们不应该猜测或询问。
-
你也可以尝试一些基本的调试(或者,如果你已经有,向我们展示结果):如果你转储
$div会发生什么?如果你转储$xpath->query()调用的结果,而不是循环它呢?您是否尝试过更简单的 XPath 表达式? -
我刚刚在在线测试服务中尝试了您的代码,它似乎工作正常:codepad.viper-7.com/lnDxE2 您是否尝试过使用这个确切的示例 HTML?也许您已经过度简化到无法再重现问题的地步?