2014-07-02 7 views
7

Demoपीएचपी सरल HTML डोम के साथ img src जाओ

मैं निम्नलिखित कोड से छवि src पाने के लिए

एचटीएमएल

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

मैं js लेखन की कोशिश की जरूरत है:

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

लेकिन यह दिखाता है कि src कुंजी मौजूद नहीं है। मैं समीक्षा अवतार छवियों को कैसे स्क्रैप कर सकता हूं?

अद्यतन:

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

यहाँ मेरे पृष्ठ का स्रोत है:

छवि url नहीं पाया जाता है जब मैं पृष्ठ स्रोत को देखा, लेकिन फ़ायरबग छवि url से पता चलता कोड:

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

क्या lazyload का उपयोग करने के कारण कोई समस्या है?

अद्यतन 2

lazyload का उपयोग करते हुए मेरी छवियों को लोड एक बार पृष्ठों लोड किए गए हैं, मैं छवि आईडी हो रही है और उन्हें lazyload js सरणी के साथ तुलना करने की कोशिश की है, लेकिन इस आईडी साथ मेल नहीं खाती lazyload var सरणी।

प्रश्न:

यह कैसे इस JSON से सरणी जे एस पाने के लिए?

उदाहरण:

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

आप क्योंकि javascipt एक बार पृष्ठ लोड होता है आलसी लोड करने के लिए छवि प्रयोग किया जाता है कठिनाई हो रही है। तत्व के आईडी को खोजने के लिए phpDom का उपयोग करें, और उसके बाद इस आईडी के आधार पर प्रासंगिक छवियों को खोजने के लिए नियमित अभिव्यक्ति का उपयोग करें। – Kami

+0

@Kami बीटी जावास्क्रिप्ट पार्स कैसे करें? –

+0

एक नया सवाल बनाते हैं, और एक प्रश्न के नई समस्याओं/अगले चरणों का जोड़कर बंद कर दें, के रूप में सहायक उत्तरों अब बन अधूरा/गलत (लोगों के रूप में वे एक अच्छा जवाब पोस्ट करने के लिए उनके स्वीकार किए जाते हैं जवाब नहीं मिलता है इस से बंद कर दिया हो जाएगा पहली बार)। इसके अलावा, कई संपादनों और मौजूदा उत्तरों के साथ प्रश्न की सभी टिप्पणियों, अपडेट्स और संदर्भ को पढ़ने और समझने में अधिक समय लगता है। –

उत्तर

4

आप क्योंकि javascipt एक बार पृष्ठ लोड होता है आलसी लोड करने के लिए छवि प्रयोग किया जाता है कठिनाई हो रही है। तत्व के आईडी को खोजने के लिए phpDom का उपयोग करें, और उसके बाद इस आईडी के आधार पर प्रासंगिक छवियों को खोजने के लिए नियमित अभिव्यक्ति का उपयोग करें।

इस लक्ष्य को हासिल करने के लिए, की तरह कुछ प्रयास करें:

$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"]; 
    } 
} 
ऊपर

अपरीक्षित है ताकि आप अड़चनों को हल करने की आवश्यकता होगी। वे प्रासंगिक जावास्क्रिप्ट निकालने और इसे जेसन में बदलने के लिए कुंजी है।

वैकल्पिक रूप से, आप स्ट्रिंग खोज कार्यों का उपयोग पंक्ति जो img बारे में जानकारी शामिल पाने के लिए, और आवश्यक मूल्य निकाल सकते हैं।

+1

@ KārlisMillers मैं इस समय PHP के लिए एक और अधिक ठोस काम कर उदाहरण देने के लिए पहुँच नहीं है, लेकिन आप स्क्रिप्ट टैग के लिए खोज करने के लिए phpdom का उपयोग कर, अपनी सामग्री निकालने को देखो, या मूल html में आईडी स्ट्रिंग के लिए खोज सकते हैं - वहाँ केवल दो मैच, नियंत्रण के लिए एक, lazyload के लिए अन्य हो, या JSON सारणी बाहर निकालने और फिर ऊपर छद्म कोड का उपयोग करने के लिए रेगुलर एक्सप्रेशन का उपयोग करना चाहिए। – Kami

+0

आइडिया के लिए धन्यवाद। मेरे उत्तर पोस्ट में मेरा अंतिम संस्करण। –

1

इस प्रयास करें -

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

वर्ग के नाम के बाद स्थान नहीं है। आपको कक्षा के नाम के अंत में स्थान जोड़ना होगा।

या

उपयोग भी पूर्ण वर्ग के नाम

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

1

उपयोग jQuery चयनकर्ताओं $ आईई ('# lazyload_-247847544_0') और आप इस

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

या अधिक विशेष रूप से

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

धन्यवाद

3

का उपयोग कर छवि स्रोत प्राप्त कर सकते हैं यदि आप तत्व पाया की src 'संपत्ति' सब आईडी सबस्ट्रिंग, "lazyload" शामिल की तलाश कर रहे हैं, तो आप पर वाइल्डकार्ड चयनकर्ता और एक हिट देखो पर कोशिश कर सकते हैं '। नीचे jsfiddle देखें। सौभाग्य!

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

Jsfiddle

+3

क्या आप कुछ स्पष्टीकरण जोड़ सकते हैं? कोड-केवल उत्तर (कभी-कभी) अच्छे होते हैं, लेकिन कोड + स्पष्टीकरण (अधिकतर समय) बेहतर होता है – Barranka

+0

आह! हां बिल्कुल। नजदीक के लिए धन्यवाद। :) –

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

सरणी में आईएमजी ID प्राप्त करें। फिर जेसन और डीकोड में var Lazyload स्क्रैच करें। फिर 2 सरणी की तुलना करें और यदि आईडी मच सरणी में डेटा जोड़ती है। सभी को धन्यवाद!

संबंधित मुद्दे