1

大家好,

我正在努力争取结果并取得了成功,但我现在陷入困境。

下面的代码显示有一个类为“vsc”的 DIV,其中是一个类为“r”的 H3。我可以使用 (//h3[@class='r'//a) 获取 H3 标签内的锚点。

我的问题是下面的表格也有一个带有“r”类的 H3,我不想要表格内的任何链接。

<li class="g">
<div class="vsc" pved="0CD4QkgowAA" bved="0CD8QkQo" sig="m15">
<h3 class="r">
<a href="https://ameriloan.com/" class="l" onmousedown="return          rwt(this,'','','','1','AFQjCNEazKuyTuAyYgnAT3MqI3aJoiAlZw','','0CDwQFjAA',null,event)">
</h3>
<div class="vspib" aria-label="Result details" role="button" tabindex="0">
<div class="s">
</div>
<table cellpadding="0" cellspacing="0" class="nrgt">

这是我用来抓取所有锚点的脚本,但它无法仅检索“vsc”DIV 中的 H3 锚点:

function getURL($url)


{
$ch=curl_init();
// This allows the script to accept HTTPS certificates "blindly"
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTP_VERSION,'CURL_HTTP_VERSION_1_1' );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Follows redirects
curl_setopt($ch, CURLOPT_MAXREDIRS, 6);  // follows up to 6 redirects
$ret = curl_exec($ch);
return $ret;
}
$i = 0;
$rawKeyword = 'EXAMPLE';
$keyword = str_replace(' ', '+', $rawKeyword);

$url = "http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=".$keyword;

//get the HTML through cURL function
$html = getURL($url);

// parse the html into a DOMDocument
$dom = new DOMDocument();
@$dom->loadHTML($html);

// grab all data
$xpath = new DOMXPath($dom);

// XPath eval to get page links and titles 
//$elementContent = $xpath->evaluate("//h3[@class='r']//a");
$elementContent = $xpath->evaluate("//div[@class='vsc']//h3[@class='r']//a");


// Print results
foreach ($elementContent as $content) {
  $i++;
  $clean = trim($content->getAttribute('href'), "/url?q=");
  echo '<strong>'.$i.'</strong>: <h3 style=" clear:none !important; font-size:10px; letter-spacing:0.1em; line-height:2.6em; text-transform:uppercase;">'.$content->textContent.'</h3><br/>'.$clean.'<br /><br />';
}

我的评估查询做错了什么?

@jdwilemo - 你的方式是正确的,我试图只在 DIV 中使用“vsc”类来获取锚点。这是更多的表格代码,它显示了另一个具有“r”类的 H3 DIV ......

<table cellpadding="0" cellspacing="0" class="nrgt">
<tbody>
<tr class="mslg">
<td style="vertical-align: top; ">
<div class="sld vsc" pved="0CIYBEJIKMAE" bved="0CIcBEJEK" sig="Q_U">
<span class="tl">
<h3 class="r">
<a href="https://example.com/?page=ent_cs_login" class="l" onmousedown="return rwt(this,'','','','2','AFQjCNEyANjoolNXGFnLVKH3S1j4CO1qQw','','0CIQBEIwQMAE',null,event)">
</h3>
</span>
<div class="vspib" aria-label="Result details" role="button" tabindex="0">
<div class="s">
</div>
</li>

一切都包裹在一个'li'标签中。该表是“li”标签中的最后一个元素。我想获得 <H3 class='r'> 锚点,而不是在 'li' 元素末尾的表格内获得 <H3 class='r'> 锚点。我希望我清除了...

4

1 回答 1

1

如果我正确理解了您的问题,那么您只需要带有 class=r AND 的 h3 的锚点,它位于带有 class=vsc 的 div下。但是您将返回多个 H3 节点。

如果这是正确的,您还需要在查询中指定 div 的类,就像对 h3 所做的那样://div[@class='vsc']/h3[@class='r'//a

如果不是这种情况,请使用更多详细信息和更广泛的 xml 示例更新您的问题,其中包含您所指的模棱两可的数据,我会完善我的答案,希望对您有所帮助!

请注意:使用“//”是告诉 XPath 从“根”或开头开始,因此 //h3 的 XPath 将返回名称为“h3”的所有节点

编辑: 如果您想要在 div 中而不是在 table 元素中的锚点,只需像这样使用祖先函数:

//h3[@class='r' and not(ancestor::table)]//a

希望这会有所帮助,如果我需要澄清其他任何事情,请告诉我!

于 2012-04-12T17:13:57.143 回答