2012-04-12 7 views
1

Guten Tag brauchen finden alle,DOMXPath-> bewerten nicht die div i

Ich versuche, Ergebnisse zu kratzen und Erfolg gehabt haben, aber ich bin jetzt stecken.

Der folgende Code zeigt, dass es einen DIV mit einer Klasse von 'vsc' gibt, und innerhalb ist ein H3 mit einer Klasse von 'r'. Ich kann den Anker innerhalb des H3-Tags mit (// h3 [@ class = 'r' // a) erhalten.

Mein Problem ist, dass die folgende Tabelle auch eine H3 mit einer Klasse von 'r' hat, und ich will keine der Links innerhalb der Tabelle.

<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"> 

Hier ist das Skript, das ich alle Anker zu kratzen verwenden, aber es funktioniert nicht nur den H3 Anker in dem ‚vsc‘ DIV abzurufen:

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 />'; 
} 

Was ich tue, falsch mit meiner Auswertung Abfrage?

@jdwilemo - Sie sind richtig in der Art, wie ich versuche, nur den Anker innerhalb des DIV mit einer Klasse von 'VSC' zu bekommen. Hier ist der Tabellencode, den die anderen H3 DIV mit einer Klasse von ‚r‘ zeigt auch ...

<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> 

Alles ist in einem ‚li‘ Tag gewickelt. Die Tabelle ist das letzte Element im Tag 'li'. Ich möchte den Anker < H3 class = 'r'> erhalten, ohne den Anker < H3 class = 'r'> in der Tabelle am Ende des Elements 'li' zu erhalten. Ich hoffe, ich habe das geklärt ...

Antwort

1

Wenn ich Ihre Frage richtig verstehe, sind Sie nur der Anker für eine h3 mit Klasse = r UND, die unter einer div mit Klasse = vsc ist. Aber Sie erhalten mehrere H3-Knoten zurück.

Wenn dies richtig ist, werden Sie auch die div Klasse in Ihrer Abfrage angeben müssen, wie Sie mit h3 taten //div[@class='vsc']/h3[@class='r'//a

Ist dies nicht der Fall ist, dann bitte Ihre Frage mit weiteren Einzelheiten aktualisieren und ein umfangreicheres XML-Beispiel, das die mehrdeutigen Daten enthält, auf die Sie sich beziehen, und ich werde meine Antwort verfeinern, hoffe, dass dies hilft!

Gerade Hinweis: Die Verwendung "//" XPath erzählt von der "root" oder Anfang zu beginnen, so dass ein XPath von // h3 alle Knoten mit name = "h3"

EDIT zurück: wenn Sie den Anker fehlen, die in der div und nicht innerhalb des Tabellenelement, verwenden Sie einfach die Vorfahren Funktion wie so:

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

hoffe, das hilft, und lassen Sie mich wissen, ob ich etwas klarstellen müssen anders !