Получить img src с PHP Simple HTML DOM

Демо

Мне нужно получить изображение src из следующего кода

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>

Я попытался написать js:

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

Но он показывает, что ключ src не существует. Как я могу удалить изображения аватара для обзора?

ОБНОВЛЕНИЕ:

URL-адрес изображения не найден, когда я просматриваю исходный код страницы, но firebug показывает URL-адрес изображения:

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

Вот исходный код моей страницы:

<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 массив.

Вопрос:

Как получить этот массив js из этого 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"}

person Kārlis Millers    schedule 02.07.2014    source источник
comment
У вас возникли трудности, потому что javascipt используется для ленивой загрузки изображения после загрузки страницы. Используйте phpDom, чтобы найти идентификатор элемента, а затем используйте регулярное выражение, чтобы найти соответствующие изображения на основе этого идентификатора.   -  person Kami    schedule 04.07.2014
comment
@Kami, как разобрать javascript?   -  person Kārlis Millers    schedule 04.07.2014


Ответы (5)


У вас возникли трудности, потому что 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"];
   }
}

Вышеупомянутое не проверено, поэтому вам нужно будет устранить перегибы. Ключевым моментом является извлечение соответствующего javascript и преобразование его в json.

В качестве альтернативы вы можете использовать функции поиска строк, чтобы получить строку, содержащую информацию об img, и извлечь требуемое значение.

person Kami    schedule 04.07.2014
comment
@KārlisMillers В данный момент у меня нет доступа к php, чтобы привести более конкретный рабочий пример, но вы можете посмотреть на использование phpdom для поиска тегов скрипта, извлечения их содержимого или поиска строки идентификатора в исходном html — там должно быть только два совпадения, одно для элемента управления, другое для отложенной загрузки, или используйте регулярное выражение для извлечения массива JSON, а затем используйте приведенный выше псевдокод. - person Kami; 04.07.2014
comment
Спасибо за Идею. Моя окончательная версия в моем ответном посте. - person Kārlis Millers; 18.07.2014

Если вы ищете все идентификаторы, которые содержат подстроку «lazyload», вы можете попробовать селектор подстановочных знаков и после попадания посмотреть свойство «src» найденного элемента. См. jsfiddle ниже. Удачи!

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

Jsfiddle

person J. LaRosee    schedule 10.07.2014
comment
Не могли бы вы добавить некоторые пояснения? Ответы только на код (иногда) хороши, но код + объяснение (в большинстве случаев) лучше - person Barranka; 10.07.2014

Попробуй это -

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

После имени класса есть пробел. Вы должны добавить пробел в конце имени класса.

OR

использовать даже полное имя класса

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

person TBI    schedule 02.07.2014

Используйте селекторы jQuery, например $('#lazyload_-247847544_0'), и вы можете получить источник изображения, используя этот

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

Или точнее

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

Спасибо

person Mirza Arslan Baig    schedule 10.07.2014

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

Получить IMG ID в массиве. Затем соскребите var Lazyload в json и декодируйте. Затем сравните 2 массива и, если id mach, добавьте данные в массив. Спасибо всем!

person Kārlis Millers    schedule 18.07.2014