2014-07-02 8 views
7

DemoGet img src mit PHP Einfachen HTML DOM

Ich brauche

das Bild src aus dem folgenden Code zu bekommen

HTML

<div class="avatar profile_CF48B2B4A31B43EC96F0561F498CE6BF "> 
    <a onclick=""> 
     <img id="lazyload_-247847544_0" height="74" width="74" class="avatar potentialFacebookAvatar avatarGUID:CF48B2B4A31B43EC96F0561F498CE6BF" src="http://media-cdn.tripadvisor.com/media/photo-l/05/f3/67/c3/lilrazzy.jpg" /> 
    </a> 
</div> 

ich mit dem Schreiben versucht, die js:

foreach($html->find('div[class=profile_CF48B2B4A31B43EC96F0561F498CE6BF] a img') as $element) { 
    $img = $element->getAttribute('src'); 
    echo $img; 
} 

Aber es zeigt src Schlüssel nicht existiert. Wie kann ich Avatarbilder abschicken?

UPDATE:

Die Bild-URL nicht gefunden wird, wenn ich auf der Seite Quelle gesucht, aber firebug zeigt die URL Bild:

<img id='lazyload_1953171323_17' height='24' alt='4 helpful votes' width='25' class='icon lazy'/>

Hier meine Seite ist Quelle code:

<div class="col1of2"> 
<div class="member_info"> 
<div id="UID_3E0FAF58557D3375508A9E5D9A7BD42F-SRC_175428572" class="memberOverlayLink" onmouseover="ta.trackEventOnPage('Reviews','show_reviewer_info_window','user_name_photo'); ta.call('ta.overlays.Factory.memberOverlayWOffset', event, this, 's3 dg rgba_gry update2012', 0, (new Element(this)).getElement('.avatar')&&(new Element(this)).getElement('.avatar').getStyle('border-radius')=='100%'?-10:0);"> 
<div class="avatar profile_3E0FAF58557D3375508A9E5D9A7BD42F "> 
<a onclick=> 
<img id='lazyload_1953171323_15' height='74' width='74' class='avatar potentialFacebookAvatar avatarGUID:3E0FAF58557D3375508A9E5D9A7BD42F'/> 
</a> 
</div> 
<div class="username mo"> 
<span class="expand_inline scrname hvrIE6 mbrName_3E0FAF58557D3375508A9E5D9A7BD42F" onclick="ta.trackEventOnPage('Reviews', 'show_reviewer_info_window', 'user_name_name_click')">Prataspeles</span> 
</div> 
</div> 
<div class="location"> 
Latvia 
</div> 
</div> 
<div class="memberBadging"> 
<div id="UID_3E0FAF58557D3375508A9E5D9A7BD42F-CONT" class="totalReviewBadge badge no_cpu" onclick="ta.trackEventOnPage('Reviews','show_reviewer_info_window','review_count'); ta.util.cookie.setPIDCookie('15984'); ta.call('ta.overlays.Factory.memberOverlayWOffset', event, this, 's3 dg rgba_gry update2012', -10, -50);"> 
<div class="reviewerTitle">Reviewer</div> 
<img id='lazyload_1953171323_16' height='24' alt='4 reviews' width='25' class='icon lazy'/> 
<span class="badgeText">4 reviews</span> 
</div> 
<div id="UID_3E0FAF58557D3375508A9E5D9A7BD42F-HV" class="helpfulVotesBadge badge no_cpu" onclick="ta.trackEventOnPage('Reviews','show_reviewer_info_window','helpful_count'); ta.util.cookie.setPIDCookie('15983'); ta.call('ta.overlays.Factory.memberOverlayWOffset', event, this, 's3 dg rgba_gry update2012', -22, -50);"> 
<img id='lazyload_1953171323_17' height='24' alt='4 helpful votes' width='25' class='icon lazy'/> 
<span class="badgeText">4 helpful votes</span> 
</div> 
</div> 
</div> 

Gibt es ein Problem wegen der Verwendung von Lazyload?

UPDATE 2

lazyload Verwendung macht meine Bilder zu laden, sobald die Seiten geladen werden, habe ich versucht, Bild-IDs erhalten und vergleichen sie mit den Array js lazyload, aber diese ID nicht mit der überein Lazyload var Array.

Frage:

Wie kommt man dieses Array aus dieser JSON js?

Beispiel:

{"id":"lazyload_-205858383_0","tagType":"img","scroll":true,"priority":100,"data":"http://media-cdn.tripadvisor.com/media/photo-l/05/f3/67/c3/lilrazzy.jpg"} 
, {"id":"lazyload_-205858383_1","tagType":"img","scroll":true,"priority":100,"data":"http://c1.tacdn.com/img2/icons/gray_flag.png"} 
, {"id":"lazyload_-205858383_2","tagType":"img","scroll":true,"priority":100,"data":"http://media-cdn.tripadvisor.com/media/photo-l/01/2a/fd/98/avatar.jpg"} 
, {"id":"lazyload_-205858383_3","tagType":"img","scroll":true,"priority":100,"data":"http://c1.tacdn.com/img2/icons/gray_flag.png"} 
, {"id":"lazyload_-205858383_4","tagType":"img","scroll":true,"priority":100,"data":"http://media-cdn.tripadvisor.com/media/photo-l/01/2e/70/5e/avatar036.jpg"} 
, {"id":"lazyload_-205858383_5","tagType":"img","scroll":false,"priority":100,"data":"http://c1.tacdn.com/img2/badges/badge_helpful.png"} 
+1

Sie haben Schwierigkeiten, weil javascipt verwendet wird, um das Bild zu laden, sobald die Seite geladen ist. Verwenden Sie phpDom, um die ID des Elements zu finden, und verwenden Sie dann regulären Ausdruck, um anhand dieser ID die relevanten Bilder zu finden. – Kami

+0

@Kami bt wie Javascript zu analysieren? –

+0

Bitte erstellen Sie eine neue Frage und hören Sie auf, neue Probleme/nächste Schritte zu einer Frage hinzuzufügen, da die hilfreichen Antworten nun unvollständig/inkorrekt werden (die Leute werden dadurch entmutigt, da sie ihre akzeptierte Antwort für eine gute Antwort nicht bekommen) das erste Mal). Außerdem braucht es mehr Zeit, um alle Kommentare, Aktualisierungen und den Kontext der Frage mit so vielen Bearbeitungen und vorhandenen Antworten zu lesen und zu verstehen. –

Antwort

4

Sie Schwierigkeiten haben, weil JavaScipt zu faul Last verwendet wird, um das Bild, sobald die Seite geladen wird. Verwenden Sie phpDom, um die ID des Elements zu finden, und verwenden Sie dann regulären Ausdruck, um anhand dieser ID die relevanten Bilder zu finden.

Um dies zu erreichen, versuchen Sie so etwas wie:

$json = json_decode("<JSONSTRING HERE>"); 

foreach($html->find('div[class=profile_CF48B2B4A31B43EC96F0561F498CE6BF] a img') as $element) { 
    $imgId = $element->getAttribute('id'); 

    foreach ($json as $lazy) 
    { 
     if ($lazy["id"] == $imgId) echo $lazy["data"]; 
    } 
} 

Die oben ist nicht getestet, so dass Sie die Knicke lösen müssen. Der Schlüssel ist, das relevante Javascript zu extrahieren und in json umzuwandeln.

Alternativ können Sie die Suchfunktionen verwenden, um die Zeile mit den Informationen zum img abzurufen und den erforderlichen Wert zu extrahieren.

+1

@ KārlisMillers Ich habe momentan keinen Zugang zu PHP, um ein konkreteres Arbeitsbeispiel zu geben, aber Sie können mit phpdom nach Skript-Tags suchen, deren Inhalt extrahieren oder nach dem ID-String im Original-HTML suchen - dort sollten nur zwei Übereinstimmungen sein, eine für das Steuerelement, die andere für das Lazyload, oder den regulären Ausdruck verwenden, um das JSON-Array zu extrahieren und dann den obigen Pseudocode zu verwenden. – Kami

+0

Danke für die Idee. Meine endgültige Version in meinem Antwortpost. –

1

Try this -

foreach($html->find('div[class=profile_CF48B2B4A31B43EC96F0561F498CE6BF ] a img') as $element) { 
$img = $element->getAttribute('src'); 
echo $img; 
} 

Es gibt Raum nach dem Klassennamen. Sie müssen am Ende des Klassennamens Platz hinzufügen.

OR

Verwendung sogar vollständige Klassennamen

$html->find('div[class=avatar profile_CF48B2B4A31B43EC96F0561F498CE6BF ] a img'

1

Verwenden jQuery Selektoren dh $ ('# lazyload_-247847544_0') und Sie können die Bildquelle erhalten diese

var src = $('#lazyload_-247847544_0').attr('src'); 

Oder genauer gesagt

$('.profile_CF48B2B4A31B43EC96F0561F498CE6BF #lazyload_-247847544_0').attr('src'); 

Dank mit

3

Wenn Sie Wenn Sie nach allen IDs suchen, die die Teilzeichenfolge "lazyload" enthalten, können Sie den Platzhalterselektor ausprobieren und bei einem Treffer die Eigenschaft 'src' des gefundenen Elements überprüfen. Sehen Sie sich das untenstehende Spiel an. Viel Glück!

$(document.body).find('img[id*=lazyload]').each(function() { 
    console.log($(this).prop('src')); 
}); 

Jsfiddle

+3

Können Sie bitte eine Erklärung hinzufügen? Code-only Antworten sind (manchmal) gut, aber Code + Erklärung ist (meistens) besser – Barranka

+0

Ah! Ja, sicher. Danke für den Anstupser. :) –

0
function getReviews(){ 

    $url = 'http://www.tripadvisor.com/Hotel_Review-g274965-d952833-Reviews-Ezera_Maja-Liepaja_Kurzeme_Region.html'; 
    $html = new simple_html_dom(); 
    $html = file_get_html($url); 
    $array = array(); 
    $i = 0; 

    // IMG ID 
    foreach($html->find('div[class=avatar] a img') as $element) { $array[$i]['id'] = $element->getAttribute('id'); $i++;} unset($i);$i = 0; 

    // IMG SRC 
    $p1 = strpos($html, 'var lazyImgs =') + 14; 
    $p2 = strpos($html, ']', $p1 ); 
    $raw = substr($html, $p1, $p2 - $p1) . ']'; 
    $images = json_decode($raw); 

    foreach ($images as $image){ 

     $id  = $image->id; 
     $data = $image->data; 
     foreach ($array as $element){ 
      if (isset($element['id']) && $element['id'] == $id){ 
       $array[$i]['image'] = $data; 
       $i++;  
      } 
     } 
    } 

    $html->clear(); 
    unset($html); 
    return $array; 
} 

Get IMG ID in Array. Dann scraech var Lazyload in JSON und dekodieren. Dann vergleiche 2 Arrays und wenn ID Mach Daten zum Array hinzufügen. Danke an alle!