Те, кто хоть раз писал парсер, знает, что не стоит этого делать с помощью регулярных выражений. Проиллюстрировать это утверждение поможет следующий пример.

 Возьмем HTML код: 

<div><a href="http://xdan.ru"><div>Сайт по программированию парсеров</div><div> и многое другое</div></a></div>

К примеру, из него нам нужно получить описание и url сайта. Если брать исключительно этот кусок кода, то все решается достаточно просто: 

$html = '<div><a href="http://xdan.ru"><div>Сайт по программированию парсеров</div><div> и многое другое</div></a></div>';
preg_match('#<div><a href="/([^"]+)"><div>([^<]+)</div><div>([^<]+)</div></a></div>#U',$html,$list);
echo 'url:'.$list[1].',title:'.$list[2].$list[3]; // выведет url:http://xdan.ru,title:Сайт по программированию парсеров и многое другое

Проблемы начинаются тогда, когда описание сайта заполняют пользователи, и оно не имеет   определенного шаблона.

<div><a href=”http://xdan.ru”><div>Сайт по <b>программированию</b> парсеров</div><div> и многое <div> многое </div> другое </div></a></div>

Такой код регулярному выражению не по зубам.

Обычно, в вузах на этот случай учат писать конечный автомат. Суть его в том, что мы перебираем, посимвольно, весь html текст, находим начало тега, и строим дерево документа. Так называемое DOM (Document Object Model)

Сейчас, писать такое самому  нет необходимости.

В php, начиная с  версии 5, есть встроенные методы работы с деревом документа (класс DOMDocument), но основан он на XML парсере.

А HTML и XML это хоть и очень похожие, но в тоже время абсолютно разные технологии.

К примеру, непременное требование к XML это закрытые теги и отсутствие ошибок.

Отсюда вытекает условие: ошибок в html, который мы парсим с помощью нативных средств php,  быть не должно.

К сожалению, на сайтах донорах, ошибки не редки, а значит этот метод отпадает.

Для корректного разбора таких сайтов, на помощь придут php библиотеки PHPQuery, Simple HTML DOM, Zend DOM Query, Nokogiri .

Некоторые из них, после небольших манипуляций скармливают html  тому же DOMDocument. Мы не будем их рассматривать.

В этой статье я расскажу про SimpleHTMLDOM. Этой библиотекой я пользуюсь уже несколько лет, и она меня еще ни разу не подводила.

Скачиваем последнюю версию здесь

Пусть Вас не смущает то, что она не обновлялась с 2008 года, то, что она умеет, полностью покроет Ваши нужды в разборе html текстов.

В архиве, который вы скачали, две папки (примеры работы и документация) и файл simple_html_dom.php.

simple_html_dom.php это и есть вся библиотека, больше ничего для работы не потребуется. Кидаем этот файл в папку с проектом и в своем скрипте просто подгружаем его.

include 'simple_html_dom.php';

Кроме документации, которую вы скачали с архивом, доступна еще online версия, ее  вы найдете здесь

Файл подключен и готов к работе.

Для того, чтобы начать разбирать HTML, его сперва нужно получить. Обычно, я делаю это при помощи библиотеки CURL.

В simplehtmldom есть методы для удаленной загрузки страниц.  После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк.

str_get_html(str) и file_get_html(url)

Они  делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.

str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.

$html = str_get_html('<html><body>Привет!</body></html>');

file_get_html – сама умеет загружать данные с удаленного URL или из локального файла

$html = file_get_html('http://www.yandex.ru/');

или

$html = file_get_html('data/test.htm');

К сожалению,  file_get_html загружает страницы обычным file_get_contents. Это значит если хостер, выставил в php.ini allow_url_fopen = false (т.е. запретил удаленно открывать файлы), то загрузить что-то удаленно, не получится. Да и серьезные веб сайты таким способом парсить не стоит, лучше использовать CURL с поддержкой proxy и ssl. Однако для наших опытов, вполне хватит и file_get_html.

$html = file_get_html('http://www.yandex.ru/'); 

в результате, в  переменной $html будет объект типа simple_html_dom.

При больших объемах данных, в библиотеке происходит утечка памяти. Поэтому после окончания одного цикла надо ее чистить.

Делает это метод clear.

К примеру грузим 5 раз сайт www.yandex .ru с разными поисковыми запросами

$k = 5; 
while($k>0){
 $html = file_get_html('http://yandex.ru/yandsearch?text=hi'.$k.'&lr=11114'); // загружаем данные
 // как-то их обрабатываем
 $html->clear(); // подчищаем за собой
 unset($html);
 $k--;
}

Эти две строчки $html->clear();  и unset($html);  лучше писать сразу же после того, как  Вы создали объект. Иначе забудете, и скрипт отвалится, забив всю память.

После того, как html текст упакован в объект, можно приступать непосредственно к поиску нужных элементов. 

Большинство поисковых функций выполняет метод find(selector, [index]).  Если второй аргумент не задан, метод возвращает массив элементов. Если же задан то элемент этого массива с индексом index.

Пример: скачаем главную страницу моего блога, и выведем все ссылки, которые встретим на своем пути.

require_once 'simple_html_dom.php';
$data = file_get_html('http://xdan.ru');
if($data->innertext!='' and count($data->find('a'))){
	foreach($data->find('a') as $a){
		echo '<a href="http://xdan.ru/'.$a->href.'">'.$a->plaintext.'</a></br>';
	}
}

В примере, в качестве селектора я воспользовался названием тега <a>. Но можно использовать и другие CSS селекторы. Элемент на странице можно найти по его атрибутам. В первую очередь, это название тега, id и class. Также могут быть использованы и второстепенные атрибуты, к примеру, href ссылки или width картинки. Если и этих атрибутов нет, то не грех воспользоваться и регулярными выражениями.

Поиск по названию тега вы уже видели

$html->find('div')

поиск по id

$html->find('#preview')

поиск по классу

$html->find('.myclass')

или комбинированный вариант

$html->find('#preview div.myclass')

в данном случае, сначала найдется элемент с id= preview затем в нем найдутся все теги div, и уже среди них фильтруются те у которых class=”myclass”

Если метод find ничего не нашел и index не задан, то он возвращает пустой массив. Если же index задан, то метод возвращает null.  

Поэтому верным решением будет проверить

if(count($html->find('#preview div.myclass')))
	foreach($html->find('#preview div.myclass') as $div)
		echo $div->innertext;

Поиск по наличию атрибута

$html->find(' img [width]'); // найдет нам все изображения у которых задан атрибут ширина

или более конкретный поиск по значению атрибута

$ret = $html->find('img[width=400px]');// найдет все изображения, у которых задана ширина равная 400px

Такая нотация позволяет искать по двум и более смежным классам

$ret = $html->find('img[class=active myclass]');//<img class="active myclass"/>

Поиск нескольких тегов

$html->find('a, img, br,span');

Поиск вложенных тегов

$es = $html->find('ul.myclass li');// найдет все li который является потомком ul(возможно и не прямым)
$es = $html->find('div.myclass li');// найдет все li в  div.myclass

У каждого найденного элемента также есть метод find

$html->find('div.myclass li');//найдет все div.myclass а потом все li лежащие в них

если нам нужно найти все li только первого div’а то мы можем написать так

$html->find('div.myclass',0)->find('li');

Поиск по значению атрибута не ограничивается только равенством. Вот доступные условия

[атрибут] – проверяет есть ли у элемента данный атрибут

[атрибут=величина] - проверяет, есть ли у элемента данный атрибут и равно ли его значение величине.( div[class=myclass] – найдет все div’ы у которых class равен myclass)

[атрибут!=величина] - проверяет, есть ли у элемента данный атрибут и не равно ли его значение величине.( div[class!=myclassok] – найдет все div’ы у которых class не равен myclassok)

[атрибут^=величина] - проверяет, есть ли у элемента данный атрибут и начинается ли его значение с величины ( div[class^=my] – найдет все div’ы у которых class начинается с my, к примеру myclass и myclassok)

 [атрибут$=величина] - проверяет, есть ли у элемента данный атрибут и заканчивается ли его значение величиной( div[class$=ok] – найдет все div’ы у которых class заканчивается на ok, к примеру myclassok, yok, okно не oki)

 [атрибут*=величина] - проверяет, есть ли у элемента данный атрибут и содержит ли его значение в себе величину, в любом месте(div[class*=sok] – найдет все div’ы у которых class содержит sok, к примеру myclassok, ysoki, sok)

Обычный текст можно искать как тег text

$es = $html->find('text'); // найдет все текстовые блоки в html

Комментарии находим по тегу comment

$es = $html->find('comment');

Каждый найденный элемент и сам $html имеют 5 полей

$html = str_get_html("<div>foo <b>bar</b></div>"); 
echo $html; // выведет <div>foo <b>bar</b></div>;
$e = $html->find("div", 0);
echo $e->tag; // Вернет: "div"
echo $e->outertext; // Вернет: <div>foo <b>bar</b></div>
echo $e->innertext; // Вернет: foo <b>bar</b>
echo $e->plaintext; // Вернет: foo bar

$e->tag            Читает или записывает имя тега элемента.

$e->outertext   Читает или записывает весь HTML элемента, включая его самого.

$e->innertext   Читает или записывает внутренний HTML элемента

$e->plaintext    Читает или записывает простой текст элемента, это эквивалентно функции strip_tags($e->innertext). Хотя поле доступно для записи, запись в него ничего не даст, и исходный html не изменит

$html = str_get_html("<div>foo <b>bar</b></div"); 
$div = $html->find('div',0);
$div->plaintext = 'gooo';
echo $div->innertext; // вернет <div>foo <b>bar</b></div>

Как  Вы могли догадаться, для удаления ненужного элемента из HTML можно затереть его поле  outertext

$html = str_get_html("<div>foo <b>bar</b></div"); 
$b = $html->find('b',0);
$b->outertext = '';
echo $html->innertext; // вернет <div>foo</div>

Тут следует помнить, что хоть элемент и не виден в html, из дерева DOM он никуда не делся

$html = str_get_html("<div>foo <b>bar</b></div"); 
$b = $html->find('b',0);
$b->outertext = '';
echo $html->innertext; // вернет <div>foo</div>, элемент удален из HTML
// но
echo count($html->find('b')); // вернет 1, в дерево элемент присутствует

при желании  мы даже можем вернуть элемент на место

$b->outertext = '<span>bar</span>';
echo $html->innertext;// вернет <div>foo<span>bar</span></div>

Для более эффективной навигации по дереву документа доступны методы

$e->children ( [int $index] )     Возвращает объект N-го прямого потомка, если индекс установлен, в противном случае возвращает массив всех дочерних элементов

$e->parent()    Возвращает родительский элемент.

$e->first_child() Возвращает первый дочерний элемент, или null, если ничего не найдено

$e->last_child() Возвращает последний дочерний элемент, или null, если ничего не найдено

$e->next_sibling() Возвращает следующий родственный элемент, или null, если ничего не найдено

$e->prev_sibling()       Возвращает предыдущий родственный элемент, или null, если ничего не найдено

пример

$html ="<div>
  <b>bar</b>
  <b>foo</b>
  <span>arg</span>
  <div>
    <b>tor</b>
  </div>
</div>"; 

Все дочерние элементы разные, как-то подобрать к ним селектор проблематично. Поэтому воспользуемся описанными методами.

$html  = str_get_html($html);
$div = $html->find('div',0);
$i = 0;
while($item = $div->children($i++)){
	echo $item->innertext;
} 

либо так

$item = $div->children(0);
echo $item->innertext;
while($item = $item -> next_sibling()){
   echo $item->innertext;
} 

Данные методы полезны при разборе таблиц, элементы которых, как правило, структурированы, но не имеют идентифицирующих атрибутов.

Ну и последняя фишка это вызов callback функции на найденный элемент

function my_callback($element) {
       if ($element->tag=='span')
                $element->outertext = '<b>'.$element->innertext. '</b>';// заменим все span элементы на b
} 
$html  = str_get_html('<span>bar</span><span>pole</span><span>sushi</span><a>okno</a>');
// Регистрация функции обратного вызова с ее именем
$html->set_callback('my_callback');// вызов функции произойдет при конвертации объекта в строку
echo $html; // на самом деле, при этом вызывается магический метод __toString, он и запускает наши калбяки

На экране мы увидим 

<b>bar</b><b>pole</b><b>sushi</b><a>okno</a>

 

Доступ к атрибутам элементов осуществляется напрямую

foreach($html->find('img') as $img) echo $img->src;
//или
echo $html->find('img',0)->src;

Хватит теории, перейдем к практике

Загрузим n фотографий из поисковой выдачи Yandex Картинок. http://images.yandex.ru/

require_once 'simple_html_dom.php';
// поисковый URL
$url = 'http://images.yandex.ru/yandsearch?text='.urlencode('Джессика Альба').'&rpt=image';
$n = 2;
// загружаем данный URL
$data = file_get_html($url);
// очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа
foreach($data->find('script,link,comment') as $tmp)$tmp->outertext = '';
// находим все изображения на странице
if(count($data->find('div.b-image img'))){
	$i = 1;
	foreach($data->find('div.b-image img') as $img){
		// выводим на экран изображение 
		echo '<img src="'.$img->src.'"/>';
		// и скачиваем его в файл
		file_put_contents('data/'.($i++).'.jpg',file_get_contents($img->src));
		if($i>$n)break; // выходим из цикла если скачали достаточно фотографий
	}
}
$data->clear();// подчищаем за собой
unset($data);

Как быть если нам нужно больше фото, чем лежит на одной странице?

Ответ прост: Код, приведенный выше, заключается в функцию, в html помимо фото находим еще  и URLвсех страниц, и рекурсивно вызываем данную функцию для этих страниц.

require_once 'simple_html_dom.php';
function getYandexImages($url,$findpages = true){
	static $i = 1;
	$n = 200;
	// загружаем данный URL
	$data = file_get_html($url);
	// очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа
	foreach($data->find('script,link,comment') as $tmp)$tmp->outertext = '';
	// находим URL страниц только для первого вызова функции
	if( $findpages and count($data->find('div.b-pager__pages a'))){
		foreach($data->find('div.b-pager__pages a') as $a){	
			// довольно распространенный случай - локальный URL. Поэтому иногда url надо дополнять до полного
			if( !preg_match('#^http://#',$a->href) )$a->href = 'http://images.yandex.ru'.$a->href;
			// и еще дна тонкость, &amp; надо заменять на &
			$a->href = str_replace('&amp;','&',$a->href);
			// вызываем функцию для каждой страницы
			getYandexImages($a->href,false);
		}
	}
	// находим все изображения на странице
	if(count($data->find('div.b-image img'))){
		foreach($data->find('div.b-image img') as $img){
			// выводим на экран изображение 
			echo '<img src="'.$img->src.'"/>';
			// и скачиваем его в файл
			file_put_contents('data/'.($i++).'.jpg',file_get_contents($img->src));
			if($i>$n)exit; // завершаем работу если скачали достаточно фотографий
		}
	}
	$data->clear();// подчищаем за собой
	unset($data);
}
// поисковый URL
$url = 'http://images.yandex.ru/yandsearch?text='.urlencode('Джессика Альба').'&rpt=image';
getYandexImages($url);

 

Все хорошо, 200 картинок лежат в папке data. Но их размер слишком мал.

Поэтому завершающим аккордом нашей практики будет загрузка увеличенной фотографии.

Для этого определим еще одну функцию

 

function getBigImage($url){
	$data = @file_get_contents($url);
	if(trim($data)=='')return false; // бывает что сайт недоступен, его фото мы не грузим
	$data = str_get_html($data);
	// находим фото
	if( count($data->find('#i-main-pic')) ){
		$dataimg = @file_get_contents($data->find('#i-main-pic',0)->src); // собачка нужна в если сервер нам вернул 404, это выозвет Warning:, поэтому экранируем ошибки
		if(trim($dataimg)=='')return false; // фото не доступно, его не грузим
		file_put_contents( 'data/'.md5($url).'.jpg', $dataimg ); // сохрпаняем в файл
	}
	$data->clear();// подчищаем за собой
	unset($data);
}

 

и слегка поправим getYandexImages

function getYandexImages($url,$findpages = true){
	global $i,$n;
	// загружаем данный URL
	$data = @file_get_contents($url);
	$data = str_get_html($data);
	// очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа
	foreach($data->find('script,link,comment') as $tmp)$tmp->outertext = '';
	// находим URL страниц только для первого вызова функции
	if( $findpages and count($data->find('div.b-pager__pages a'))){
		foreach($data->find('div.b-pager__pages a') as $a){	
			// довольно распространенный случай - локальный URL. Поэтому иногда url надо дополнять до полного
			if( !preg_match('#^http://#',$a->href) )$a->href = 'http://images.yandex.ru'.$a->href;
			// и еще дна тонкость, &amp; надо заменять на &
			$a->href = str_replace('&amp;','&',$a->href);
			// вызываем функцию для каждой страницы
			getYandexImages($a->href,false);
		}
	}
	// находим все изображения на странице
	if(count($data->find('div.b-image img'))){
		foreach($data->find('div.b-image a') as $a){
			if( !preg_match('#^http://#',$a->href) )$a->href = 'http://images.yandex.ru'.$a->href;
			$a->href = str_replace('&amp;','&',$a->href);
			getBigImage($a->href);
			if($i++>=$n)exit; // завершаем работу если скачали достаточно фотографий
			echo '<script>document.getElementById("counter").innerHTML = "Загружено: '.$i.' из '.$n.' фото";</script>';
			flush();
		}
	}
	$data->clear();// подчищаем за собой
	unset($data);
}
// поисковый URL
$i = 1;
$n = 20; // будем грабить 20 картинок
$url = 'http://images.yandex.ru/yandsearch?text='.urlencode('Джессика Альба').'&rpt=image';
getYandexImages($url);

 

Вот и все, наслаждаемся фото великолепной Джессики Альбы. Надеюсь меня простит Яндекс, ведь по сути фото грабится не с их серверов, а с прямиком с сайтов, где они лежат.

Кроме того это всего лишь демонстрация работы. Думаю никому в здравом уме, не придет в голову парсить Яндекс с помощью file_get_content. Данную библиотеку можно применять и в мирном программировании. К примеру в качестве шаблонизатора для CMS. Почему нет, с хорошим кешированием будет очень удобная штука.

 При больших объемах сайтов доноров,  неплохо бы разбить все на потоки.

А используя описанный мой скрипт сортировки изображений по цвету, можно собрать неплохую отсортированную базу, фотографий знаменитостей.

И, как всегда, выкладываю все исходники

UPD: Благодаря пользователю Диме, выяснилось, что библиотека обновилась 2011-07-14 и имеет версию 1.5. Нововведений не много, однако самый главный баг, с которым сталкивались все, кто пользовался библиотекой, а именно утечка памяти, устранен. На то она и версия 1.5, а не 2.0. Радует, что проект все же поддерживается и развивается. Ждем новых релизов.

Рассказать друзьям
author.jpg

Платная консультация по вопросам 1500 руб/час

Прочитали статью и остались вопросы? Меня зовут Валерий и я её автор. С радостью объясню Вам в скайпе все затруднительные моменты, которые остались за рамками статьи!

Подробнее ...

Добавить комментарий


Защитный код
Обновить

Комментарии   

+3
Grisha
# Grisha 08.04.2011 04:09
Спасибо!!!
+1
Игорь
# Игорь 01.05.2011 01:42
Вот скажем есть стр.:

http://cell-phones.shop.ebay.com/Cell-Phones-Smartphones-/3312/i.html?LH_BIN=1&_trkparms=65%253A10%257C66%253A4%257C39%253A1&rt=nc
&_dmpt=Cell_Phones&_ds=1&_fcid=168&_localstpos=&_sc=1&_sticky=1&_stpos=&_trksid=p3286.c0.m14
&gbr=1&_sop=15&_sc=1

Как спарсить картинки отдельно, описание отдельно, цену отдельно?
0
Leroy
# Leroy 03.05.2011 14:00
$site = 'http://cell-phones...=15&_sc=1';
$data = file_get_html($site);
foreach($data->find('#v4-56 table') as $table){
echo @$table->find('img',0)->src.'=>';
echo @$table->find('td.prc div.g-b',0)->plaintext.'=>';
echo @$table->find('div.ttl',0)->plaintext.'
';
flush();
}
$data->clear();
unset($data);


вродь все просто, откройте сайт в каком-нибудь DOM инспекторе и смотрите его структуру.

Встроенный дом инспектор есть в Опере,Хроме и IE начиная с 8 вродь. На файрфокс есть фаербаг.
+1
Павел
# Павел 19.06.2011 05:07
"str_get_htm – на вход получает обычную строку" тут функция должна быть str_get_html
+2
Павел
# Павел 19.06.2011 05:08
спасибо за статью
0
Иван
# Иван 16.07.2011 21:51
Здравствуйте, написал вот такой парс

$html = file_get_html("D:\Files\сайт\detail_ajax.htm");



foreach($html->find('script,link,comment') as $tmp)$tmp->outertext = '';

if(count($html->find('span[class="titleproductname]'))){

foreach($html->find('span[class="titleproductname] ') as $a){



print $title = $a->plaintext."
";





}

}



if(count($html->find('.textproductdescription'))){

foreach($html->find('.textproductdescription') as $a){



echo $a->innertext;





//при echo в цикле выводится все строки с дивов .textproductdescription

но когда присваеваю значение переменной, выводиться с переменной только одна строка, последняя



}

}

$image = $html->find('img',0)->src;

//echo $title, $text, $image;

$html->clear();

unset($html);

//подскажите как в цикле присвоить значение переменной?

или записать результат многих дивов?
0
Игорь
# Игорь 05.10.2011 00:43
Просто, спасибо!
0
Николай
# Николай 05.10.2011 16:42
Спасибо вам огромное...
0
Слава
# Слава 21.10.2011 04:43
foreach($data->find('div.b-pager__pages a')

что такое div.b-pager__pages a не могу разобраться
0
1341234
# 1341234 10.11.2011 01:58
блин. больше не статью читаю, а по бокам рисую. ни какой работы
0
Лариса
# Лариса 10.11.2011 16:54
А как делается такой фон? Оч забавно и ново. :) И читаешь и рисуешь одновременно
0
Олег
# Олег 17.01.2012 17:11
Очень полезная и интересная статья. Помогла реализовать мои идеи в кратчайшее время. Все в простой и доступной форме. Автору СПАСИБО.
0
serhey
# serhey 19.01.2012 04:41
да очень полезная статья !!!! Спасибо автору !!
0
Sleepwalker
# Sleepwalker 07.02.2012 16:05
// очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа

foreach($data->find('script,link,comment') as $tmp)$tmp->outertext = '';



Скажите, а здесь разве $data изменяется? разве изменения не происходят в локальной переменной $tmp ?
0
lerik
# lerik 07.02.2012 21:06
Для интереса попробуйте такой код
$g= array(1,2,3);
foreach($g as $j)
$j++;
print_r($g);
будете приятно удивлены
0
opozZzum
# opozZzum 07.08.2012 12:07
а разве не foreach($g as &$j) ?
0
Leroy
# Leroy 07.08.2012 21:07
опа это я ступил=) да вы правы именно так с &
+1
Leroy
# Leroy 07.08.2012 21:08
тут немного ошибся, вообщем дело в том что сам $tmp как свойство сеодержит ссылку на некий объект который и изменяется, если мы будем менять сам $tmp то ничего не измениться, а вот если одно из его полей то изменения произойдут
0
Игорь
# Игорь 10.02.2012 03:37
Привет ребята. Я получил список ссылок с моего сайта такого типа:

1 -ссылка1

2 -ссылка2

1 -ссылка3

2 -ссылка4



что мне нужно дописать в коде, чтобы выводилось так:



1 -ссылка1

1 -ссылка2

1 -ссылка3

1 -ссылка4



у нужной мне ссылки нету атрибутов, для её поиска...

Заранее спасибо.
0
Svetlana
# Svetlana 20.02.2012 02:35
Спасибо, буду разбираться...



Ждем возвращения из армии!

Если, что надо пишите, вдруг сможем помочь!
0
Сергей
# Сергей 21.02.2012 21:01
не могу разобраться с загрузкой файлов



file_put_contents('data/'.($nomer).'.jpg',file_get_contents($img->src));



сохраняет нужное количество фалов в папке, но все они пустые

$img->src - содержит правильный путь к фото на сайте .. в чем беда не пойму :(
0
Сергей
# Сергей 21.02.2012 21:02
сам спросил, сам ответил :)

как только написал вопрос понял в чем проблема - оказывается в $img->src хранился относительный путь в фото, банально добавил название домена и все ок.



спасибо за помощь :) !
0
Stas
# Stas 02.03.2012 13:05
Добрый день!

Имеется следующий кусок кода:



Автор:А.Мецгер


ISBN:978-5-378-02142-0


Переплет:


Страниц:16


Формат:200х280



Со СПАНами все понятно, но нужно присвоить переменным значения,которые между тегами /strong и br или /strong и /span (для последнего случая)



Например:

MyAuthor = "А.Мецгер"

MyBinding = ""



Причем вся строка, например (ISBN:978-5-378-02142-0
) может отсутствовать.

Заранее благодарен.
0
Stas
# Stas 02.03.2012 13:10
Простите, заменяю текст



Добрый день!

Имеется следующий кусок кода:

{span class="block"}

{strong}Автор:{/strong}А.Мецгер{br}

{strong}ISBN:{/strong}978-5-378-02142-0{br}

{strong}Переплет:{/strong}{br}

{strong}Страниц:{/strong}16{br}

{strong}Формат:{/strong}200х280

{/span}

Со СПАНами все понятно, но нужно присвоить переменным значения,которые между тегами /strong и br или /strong и /span (для последнего случая)



Например:

MyAuthor = "А.Мецгер"

MyBinding = ""



Причем вся строка, например ({strong}ISBN:{/strong}978-5-378-02142-0{br}) может отсутствовать.

Заранее благодарен.
0
Димон
# Димон 18.04.2012 15:49
Супер! Молодчага что написал! Регулярка достает!
0
Антон
# Антон 10.06.2012 04:43
Нужен специалист для создания парсера и настройки переноса контента. Пишите на почту k-klient собак mail.ru
0
ygor
# ygor 12.06.2012 16:46
Что-то не пойму, как спарсить определённое значение скажем есть 1.txt файл с содержимым:

/pages/13674/1367437.shtml

/pages/14072/1407291.shtml

/pages/14107/1410773.shtml

/download.php?id=1420841.mp3

/reklama.shtml

/rp/list.php

/spages/events.shtml

Каким образом их этого файла выбрать имено строку: /download.php?id=1420841.mp3 ??? Спасибо заранее.
0
Leroy
# Leroy 12.06.2012 18:04
$data = explode("\r",file_get_contents('1.txt'));
foreach($data as $st){
if( preg_match("#\.mp3$#",$value) ){
echo $value.'
';
}
}


Я думаю тут все понятно) а вообще это элементарная работа со строками

P.S. Возможно что-то не работает, я только пришел с армии =)
0
Svetlana
# Svetlana 13.06.2012 03:04
С возвращением!!!
0
Leroy
# Leroy 13.06.2012 03:19
спасибо!)
0
ygor
# ygor 12.06.2012 18:47
Поздравляю с приходом))), Но действительно, не что-то, а вообще не работает (((
0
ygor
# ygor 12.06.2012 20:46
Да что такое, вообще запутался, ниче не выходит, пол дня бьюсь, может кто подскажет? бакс на кошелёк перечислю... Вот проблемма с выражением выше ничего не получилось. Даю прямой текст:

надо с этой страницы:

http://zaycev.net/pages/14208/1420841.shtml

выдрать ссылку **********.mp3 она одна там, выкладывайте вариант с Z Кошельком... СПС
0
Leroy
# Leroy 12.06.2012 21:28
элементарно

$data = file_get_contents('http://zaycev.net/pages/14208/1420841.shtml');
if( preg_match_all('#href="([^"]*\.mp3)"#Uis',$data,$list) )
print_r($list[1]);//в $list[1] будут все нужные нам ссылки со страницы
0
Александр
# Александр 21.06.2012 16:44
подскажите как выбрать элемент по класу если класов несколько через пробел?



....

0
Leroy
# Leroy 21.06.2012 17:12
Как вариант

$html = str_get_html('<div> <div class="div1">1</div>
<div class="div1">2</div>
<div class="div1 div2">3</div>
<div class="div1">4</div>
</div>');
$divs = $html->find('div.div1[class*=div2]');
0
Leroy
# Leroy 21.06.2012 17:21
ну или напрямую
$html->find('div[class=div1 div2]');
0
Александр
# Александр 21.06.2012 17:45
спасибо. еще вопрос метод clear вызывает ошибку

ErrorException [ Fatal Error ]: Allowed memory size of 134217728 bytes exhausted (tried to allocate 59008046 bytes)



фреймворк kohana
0
Leroy
# Leroy 21.06.2012 17:59
это не метод clear ее вызывает, а его не своевременный вызов. Где-то что-то не уничтожаете. Я писал про это
0
Виктор
# Виктор 24.06.2012 18:47
А вот у меня через полминуты выдает ошибку:

Fatal error: Maximum execution time of 30 seconds exceeded in simple_html_dom.php on line 70



Кстати, оригинальные примеры с Джессикой Альбой также не дорабатывают до конца, если увеличить количество выкачиваемого с 20 до, хотя бы, 500.
0
Leroy
# Leroy 24.06.2012 20:17
Знакомые грабли. Добавьте в начало скрипта эту строчку
ini_get('safe_mode') or set_time_limit(0);
и будет Вам счастье)
0
Виктор
# Виктор 25.06.2012 05:28
Всякий должен сам наступить на грабли! Спасибо - работает.
0
Викуля
# Викуля 29.06.2012 00:22
привет:)

парни, а совсем тугой можно помочь:)?

мне надо простейшую программульку -выдрать номера телефонов из одной категории сайта обьявлений.

никаких наворотов больше не надо - только голый текст с номерами тел. в столбик - шеф поручил составить такой список - я за день только 200 номеров собрала.

была бы очень благодарна за помощь:)
0
Leroy
# Leroy 29.06.2012 02:43
пиши на ящик, конешно помогу
0
Дима
# Дима 11.08.2012 01:00
обнови текст статьи- библиотека обновлена в 2011 году, если я правильно понял))
0
Миша
# Миша 26.08.2012 02:15
Спасибо, статья очень полезная
0
Евгений
# Евгений 30.08.2012 19:39
Имеется div вида


<div class="classname">
<p><strong>Текст</strong>: <strong>Текст</strong>.<br /><br /><strong>Текст</strong>: Текст<br /><strong>Текст</strong>: Текст<br /><strong>Жанр</strong>: Текст<br /><strong>Текст</strong>: Текст<br /><strong>Текст</strong>: Текст<br /><strong>Текст</strong>: Текст<br /><strong>Текст</strong>: Текст</p>
<p style="text-align: center;"><strong>Нужный текст1</strong></p>
<p style="text-align: center;"><iframe src="Нужная ссылка1" width="607" height="360" frameborder="0"></iframe></p>
<p style="text-align: center;">Нужный текст2</p>
<p style="text-align: center;"><iframe src="Нужная ссылка2" width="607" height="360" frameborder="0"></iframe></p>
<p style="text-align: center;"><strong>Нужный текст3</strong></p>
<p style="text-align: center;"><iframe src="Нужная ссылка3" width="607" height="360" frameborder="0"></iframe></p>
<p style="text-align: center;">Нужный текст4</p>
<p style="text-align: center;"><iframe src="Нужная ссылка4" width="607" height="360" frameborder="0"></iframe></p>
<p style="text-align: center;"><strong>Нужный текст5</strong></p>
<p style="text-align: center;"><iframe src="Нужная ссылка5" width="607" height="360" frameborder="0"></iframe></p>
</div>


Подскажите пожалуйста как распарсить и вывести нужный текст и соответствующую ему нужную ссылку. Всю голову сломал.
0
Leroy
# Leroy 30.08.2012 19:55
ну на вскидку примерно так
$data = str_get_html('код');
foreach($data->find('iframe') as $iframe){
echo $iframe->src.' '.$iframe->parent()->prev_sibling ()->plaintext.'<br>';
}
0
Евгений
# Евгений 30.08.2012 20:12
Спасибо!
0
Александр
# Александр 24.09.2012 15:10
Здравствуйте! Скачал ваши примеры, работает только один с ярлыками вашего блога. Пробовал спарсить по вашей инструкции спец предложения http://www.aviasales.ru/, ну не как не получается, страничка пустая все время.:(
0
Leroy
# Leroy 24.09.2012 17:10

Я ведь написал, что серьезные парсеры не пишутся через file_get_contents, нужно использовать curl


function request($url,$post = 0){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url ); // отправляем на
curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвратить то что вернул сервер

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt'); // сохранять куки в файл
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_POST, $post!==0 ); // использовать данные в post
if($post)
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo request('aviasales.ru');


все отлично работает, почитайте эти статьи Авторизация на сайте при помощи curl php и Многопоточные парсеры
0
Александр
# Александр 24.09.2012 23:26
Спасибо за наводку, но признаюсь, мало что понял.

1. Обязательно нужна авторизация на сайте, что парсить данные?

2. Не понял тот пример что вы написали выше. Как он применим к моей ситуации.

Попробовал сделать следующим образом:

<? php

include_once('simple_html_dom.php');//подключаем библиотеку

//Инициализируем cURL-сессию
$ch = curl_init ("http://www.aviasales.ru/");

//открываем для записи файл yandex.txt
//сюда внесём исходный html-код
$fp = fopen ("avia.txt", "w");

//указываем куда копировать содержимое
curl_setopt ($ch, CURLOPT_FILE, $fp);

//Заголовок - не выводим
curl_setopt ($ch, CURLOPT_HEADER, 0);

//Поехали!
curl_exec ($ch);

//Закрываем cURL-сессию
curl_close ($ch);

//Закрываем дексриптор файла
fclose ($fp);

//И вставляем на страницу полученный код
include 'avia.txt';
?>


Можно как то по подробнее рассмотреть мою ситуацию?
0
Александр
# Александр 24.09.2012 23:29
Кстати как написано в статье сделать проверку PHP.ini на предмет включена cURL или нет. Сделал.



cURL support - enabled

cURL Information -libcurl/7.20.0 OpenSSL/0.9.8o zlib/1.2.3
0
Александр
# Александр 24.09.2012 23:39
Убрал:


include_once('simple_html_dom.php');//подключаем
библиотеку


пропала ошибка 500, с но все равно все пусто. Я если это проделать с yandex то парситься на ура! Подскажите что нужно сделать?:)
0
Leroy
# Leroy 25.09.2012 03:16
я проверил, мой пример выше работает прекрасно. Вам всего лишь нужно было сменить урл с aviasales.ru на http://www.aviasales.ru/specpredlozheniya-aviakompaniy и все заработает

авторизовыватся на сайте не нужно, дал линк на статью чтобы почитали про курл и общие принципы
0
Александр
# Александр 25.09.2012 10:04
Видимо я совсем не понимаю. В вашем примере нет
$url='aviasales.ru';


Значит нужно произвести замену в
echo request('aviasales.ru');
на
echo request('http://www.avi...aniy');
Правильно понял вас?

Я создал cookie.txt в той же директории где и лежит index.php, соответственно подправил путь:
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'cookie.txt');


т.е. получается:
<? php
include_once('simple_html_dom.php');
function request($url,$post = 0){
$ch = curl_init();//здесь разве не нужно прописать адрес страницы для которой открывается сессия?
curl_setopt($ch, CURLOPT_URL, $url );//В вашем примере нигде не описана перменная $ur
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE,dirname(__FILE__).'cookie.txt');
curl_setopt($ch, CURLOPT_POST, $post!==0 );
if($post)
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo request('http://www.aviasales.ru/specpredlozheniya-aviakompaniy'); //здесь мне вообще схема работы не понятна
?>


Но у меня все равно появляется сообщение с кодом 500. Честно говоря уже перечитал все не на раз. И хочу разобраться, но как то еще запутаннее получается.
0
Александр
# Александр 25.09.2012 10:15
Не верные пути указал в выше указанном файле в моем случае:

curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE,'cookie.txt');
0
Leroy
# Leroy 25.09.2012 12:44
вы правильно поняли, нужно поменять именно там.

создавать cookie.txt не надо, он автоматически создастся, если сервере вернет куки

$ch = curl_init(); - адресс можно не прописывать, если он пишется ниже

curl_setopt($ch, CURLOPT_URL, $url );

в вашем коде в 15 строчке ошибка, нет слеша после dirname(__FILE__)

ошибка 500 возникает скорее всего потому, что в скрипте есть ошибка, а ваш сервер настроен на то чтобы не выдавать ошибок php, почитайте статейку как включить показ ошибок в php
0
Александр
# Александр 25.09.2012 14:44
Огромное спасибо! Сделал чтобы выводились ошибки по php, и исправил недочеты.:)

Очень благодарен!

А не подскажете дальше что изучать, чтобы вывести нужный мне контент, а не все в подряд?
0
Leroy
# Leroy 25.09.2012 15:03
эту статью)
0
Александр
# Александр 25.09.2012 15:55
Решил с простого вашего примера начать: Вывести контент с тегом "a".

Не могу понять что именно нужно вставить в $html = str_get_html('__________');

Пробовал и имя функции - request и $url, толку нет.

Вставлял после : return data;
0
Leroy
# Leroy 25.09.2012 16:00
str_get_html(request('http://xdan.ru'));

str_get_html - на вход принимает строку

file_get_html - на вход принимает url либо адрес файла
0
Александр
# Александр 25.09.2012 22:37
Спасибо, понял что не так делал. вот что у меня получилось:

?<?php
ini_get('safe_mode') or set_time_limit(0);
function request($url,$post = 0){
$ch = curl_init();
$url = 'http://www.aviasales.ru/';
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_POST, $post!==0 );
if($post)
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

include_once('simple_html_dom.php');
$html = str_get_html(request('http://www.aviasales.ru/'));
if($html->innertext!='' and count($html->find('#holliday_prices'))){
foreach($html->find('#holliday_prices') as $blok){
echo $blok;
}
}
?>


Подскажите как дальше поправить адреса ссылок. Сейчас ссылки ссылаются на не существующие адреса, как их заменить на свой адрес? Не могу понять как сделать связку со следующим:

 foreach($html->find('#holliday_prices') as $blok){...


Пробовал сделать следующее, но видимо не то:
$blok->find('a', 1)->href = 'www.test.ru';
Прошу очередной раз вашей помощи:)
0
Leroy
# Leroy 26.09.2012 12:45
наверно как-то так


foreach( $html->find('#holliday_prices a') as $a){
$a->href = str_replace('http://www.a..s.ru/','http://xdan.ru',$a->href);
}
echo $html->find('#holliday_prices',0)->innertext;
0
Александр
# Александр 26.09.2012 14:16
Спасибо, работает. Я сделал немного по другому:
if($html->find('#holliday_prices')){
foreach($html->find('#holliday_prices') as $blok){

}
}

$newurl = "http://test.ru/";
echo preg_replace('#(\<a[^\>]*href\=\")(.*?)(\"\>)#', "$1{$newurl}$3", $blok);


Сделал так, потому что ваш вариант работает только с конкретной ссылкой:)Теперь надо понять, как это дело украшать)
0
Leroy
# Leroy 26.09.2012 14:32
остается понять, что вы делаете на этой странице, раз все равно используете регулярки =)
0
Александр
# Александр 26.09.2012 16:15
Честно говоря, просто свое решение я нашел раньше и решил его отобразить здесь. Но пытаюсь понять как сделать это не через регулярки. PHP я только начинаю изучать, поэтому может получается каша в коде:)Кстати, вам бы форум бы сделать, где можно было бы обсуждать статьи и свои скрипты на основе их:)
0
Александр
# Александр 26.09.2012 16:22
А как с вами можно связаться? просто аська указанная в вашем профеле, принадлежит другому человеку.
0
Денис
# Денис 25.09.2012 05:53
Отличная статья, спасибо! Все что нужно оговорено. Пишите еще.
0
Евгений
# Евгений 25.09.2012 11:43
Данная статья была для меня крайне полезна, спасибо автору.

Когда задавал вопрос, подписался на уведомления о комментариях, но как теперь отписаться?
0
Leroy
# Leroy 25.09.2012 12:05
развиваю движок, извините за неудобство. Сейчас добавлю такой функционал
0
Leroy
# Leroy 25.09.2012 12:22
хотя нет соврал, есть такая возможность, напишите комент и уберите галочку Подписаться на уведомления о новых комментариях
0
Leroy
# Leroy 25.09.2012 13:45
теперь есть такая возможность, хотя вы наверно уже отписались
0
qazarius
# qazarius 01.10.2012 05:08
Спасибо

Кажется помогло
0
Александр
# Александр 26.09.2012 16:51
А вы можете написать про кодировку?

Вот такая ситуация:

У меня CMS на win1251, а сайт донер на UTF8, парсинговый скрипт соответственно пишется в кодировке UTF-8. Как только этот скрипт подгружаю на сайт в нужное место, весь спарсенный контент появляется ввиде символов. Как сделать так чтобы Данные нормально отображались и при кодеровке win1251&
0
Leroy
# Leroy 26.09.2012 17:02
$text = iconv('utf-8','windows-1251',$text);


работает не всегда, т.к. многих символов в win, которые есть в utf, попросту нет.

еще есть mb_convert, загуглите

еще на php.net под описанием iconv куча велосипедных реализаций, если iconv не справляется то попробуйте их, по опыту скажу, что 100% рабочего решения вы не найдете, у каждого сайта свои тонкости. Это та еще проблемка
0
Jeka
# Jeka 29.09.2012 01:14
Прочитал первые несколько слов, сразу захотелось выразить несогласие, с помощью регекспов можно распарсить разметку любой сложности, если уметь ими пользоваться. ИМХО
0
Leroy
# Leroy 30.09.2012 22:49
уверяю вас, не любой, пользовался регэкспами до знакомства с этой библиотекой, самые проблемы возникают когда разметка у одной и той же страницы различается в зависимости от контента, никакие регэкспы не помогут если при заполнении юзер может сам вводить произвольные теги в содержание, тогда только dom
0
levarm
# levarm 04.10.2012 21:28
Подскажите как персить текст группируя по class: ico-phone, ico-ICQ, ico-adress сложность заключается в том что эти элементы стоят в span перед нужным для персинга текстом.

<div class="padB10 wrapMargin">
<div class="wrapIcons"><span class="ico-set ico-phone"></span>9131258 </div>
<div class="wrapIcons"><span class="ico-set ico-phone"></span>(846) 248-32-02 </div>
<div class="wrapIcons"><span class="ico-set ico-ICQ"></span>571-524-990</div>
<div class="wrapIcons"><span class="ico-set ico-adress"></span> Адрес предприятия</div>
</div>
0
Leroy
# Leroy 04.10.2012 21:50

$data = str_get_html('код');
foreach($data->find('ico-phone,ico-ICQ,ico-adress') as $item){
// 1 вариант
echo $item->next_sibling()->innertext; // не уверен, что сработает
// 2 вариант
echo $item->parent()->innertext; // если все как в вашем примере
// 3 вариант
$item->parent()->find('ico-phone,ico-ICQ,ico-adress',0)->outertext = '';
echo $item->parent()->innertext;
}
// 4 вариант
foreach($data->find('wrapIcons') as $item){
echo $item->innertext;
}


не один из вариантов не проверял, и думаю кусок кода вы привели для примера, но думаю ход мыслей понятен
0
Bane
# Bane 16.10.2012 17:18
Спасибо автору! Начал знакомство с парсерами с этой статьи. Теперь могу парсить практически все.
0
serg
# serg 01.11.2012 03:42
А как отсюда спарсить title и саму картинку, да еще и 2 слэша мешают((

<img class="lazy" title="testing image" data-src="//test.com/img/test.img" />
0
Leroy
# Leroy 01.11.2012 13:00
подобные вещи типа echo $a->src; делаются через "магические" методы php, т.е. эта запись эквивалентна echo $a->__get('src'); а в вашем случае будет echo $a->__get('data-src');, однако чтобы в эти дебри не углубляться у библиотеки есть стандартные методы getAttribute и setAttribute эквивалентные javascript'ским
$img = str_get_html('<img class="lazy" title="testing image" data-src="//test.com/img/test.img" />');
echo str_replace('//','/',$img->getAttribute('data-src'));
0
IgorA100
# IgorA100 03.11.2012 17:00
Добрый день.

Столкнулся с проблемой кодировки :(

Есть страница: http://beward.ru/goods/?dir1=1&dir2=14 в кодировке "windows-1251"



Есть рабочая ф-ция


function curl_gets_NEW($url){
$ch = curl_init();

$allUseragents = array(
"Opera/9.23 (Windows NT 5.1; U; ru)",
"Mozilla/16.0.1 (compatible; MSIE 5.12; Mac_PowerPC)",
"Opera/8.54 (Windows NT 5.1; U; ru)",
"Opera/9.21 (Windows NT 5.0; U; ru)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; 3305; Wanadoo 6.1)",
);

$agent = $allUseragents[array_rand($allUseragents)];
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,//return data as string
CURLOPT_CONNECTTIMEOUT => 10,//timeout
CURLOPT_TIMEOUT => 100,
CURLOPT_USERAGENT => $agent,
CURLOPT_HEADER => 0,
CURLOPT_NOPROGRESS => 0,
CURLOPT_FAILONERROR => 0,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_SSL_VERIFYPEER => 0,
)
);


$data = curl_exec($ch);
curl_close($ch);
return $data;
}


Читаем:

$url = 'http://beward.ru/goods/?dir1=1&dir2=14';

$content = curl_gets_NEW($url);

Все нормально!

Далее, читаем: $HTMLtext = str_get_html($content,true,true,'windows-1251');

и получаем вместо русских букв пустоту :(

Если не указывать кодировку при "str_get_html", то появляется белеберда.

mb_detect_encoding тоже не помогает. Вообще вошел в ступор :(
0
Lucky_7
# Lucky_7 04.11.2012 11:01
Вы в какой кодировке работаете-то? Надо все привести к общему знаменателю - то есть если ваш скрипт и база работают с UTF-8, то вам надо результаты парсинга сконвертировать в UTF-8. Тут поможет iconv().

А вообще я бы советовал работать с чистым DOMDocument через xpath без использования дополнительных библиотек.
0
IgorA100
# IgorA100 04.11.2012 16:56
Работаю в win-1251

Про приведение к единой кодировке я в курсе, но ни iconv(), ни mb_detect_encoding() не помогали.

Все оказалось банально просто, сайт говорит что кодировка win-1251, а реально контент на нем в win-1252.
0
Виталий
# Виталий 28.11.2012 10:05
В общем есть сайт-http://auctions.a-automarket.com/auctions/?p= project/searchform&s&ld при авторизации выдаёт форму поиска, так вот эту форму нужно встроить в свой сайт. Как это реализовать? Узал simplehtmldom_1_5, но так и не разобрался как зайти на закрытую страницу средствами php( Нашел «lxml» библиотеку для парсинга, но не знаю есть ли смысл тратить время на её изучение...В общем был бы благодарен за помощь, а если конкретно укажите что и как делать готов материально поблагодарить)
0
Leroy
# Leroy 28.11.2012 15:27
все тоже самое что и обычный парсинг, за исключением того что сперва нужно авторизоваться
0
Максим
# Максим 29.11.2012 21:21
Подскажите пожалуйста. есть такой HTML




<dl class="catalog">
<dt>
<dd>
<dd>
<dd>
</dl>




В тэгах есть еще вложенные , это я скопировал не раскрыв их.



Мне нужно занести в массив, делаю так:


$cat = $data->find('.catalog dd');




И в $cat добавляются все тэги и вложенные все, а мне надо только которые первые, не глубже. Как можно это сделать?
0
Leroy
# Leroy 30.11.2012 13:02
в топике есть примеры перебора дочерних элементов, либо методом children либо методом next_sibling
0
Dexel
# Dexel 03.12.2012 23:28
Загрузка обеих процессоров под 100% при выполнении команды str_get_html(str)

Может из-за того, что страница перекодирована из win1251 в UTF-8
0
Leroy
# Leroy 04.12.2012 13:45
может просто страничка большая?
0
Никита
# Никита 07.12.2012 02:19
Как перекодировать полученные данные с сайта, который на utf-8, так как при выводе у себя (cp1251) фрагмент с кирилицей "169 р." отображается как "169 СЂ."



iconv не работает
0
Leroy
# Leroy 07.12.2012 13:21
перевод из большей кодировки в меньшую вообще сопряжен с такими вещами, потому как в cp1251 тупо меньше букавак, панацею я не нашел, каждый раз помогал определенный конвертер. Искать их стоит в комментах к iconv на php.net
0
Алексей
# Алексей 19.12.2012 12:06
Отличная статья.

Автору спасибо. Как раз необходим был хороший пример помимо мануала.

Я в парсинге новичок, но появилась такая необходимость.

Подскажите, как правильно организовать парсер новостных сайтов. Я так понимаю, делать это с сервера, на котором расположен сайт агригатор не стоит?
0
Leroy
# Leroy 19.12.2012 13:23
ну вообще можно и сделать почему нет. Новостники вряд ли имеют сколько нибудь сильную защиту. Обычно он почти все через рсс выдают, грабь не хочу. Даже эта либа не нужна
0
naut
# naut 02.01.2013 21:41
Привет, Друзья!

Всех с Новым годом! Ура!

Помогите, запутался, не пойму что не так (новичёк-самоучка, что с меня взять))).

Вопрос в следующем.

Извлек страницу, распарсил этой чудной библиотекой, на экран все выводится в лучшем виде, но при записи в файл (стоит задача сохранить в один файл все ссылки) получается не 1 файл со списком N-ссылок, а N-файлов с ОДНОЙ каждой последующей ссылкой. Уже всякие варианты перебрал, менял циклы всякие, получается либо последняя ссылка в одном файле, либо как уже описал. Вот кусок кода где происходят итерации (подскажите ошибку):



$html= str_get_html($str);

$n = count($html->find('a, href'));

foreach($html->find('script,comment,image,img, png, jpg') as $tmp)$tmp->outertext = '';

if(count($html->find('a'))){

$i=0;

foreach($html->find('a') as $links){

echo $links->href .' ('. $links->innertext. ')
';

$result = file_put_contents(($i++).'Links.txt', $links->href);

if($i==$n)break;





if ($result) echo 'Данные в файл успешно занесены.';

else echo 'Ошибка при записи в файл.';



0
Нурбол
# Нурбол 20.02.2013 20:02
Здравствуйте

какой код тут надо сделать что бы взять цифры с 246.62 и 4.87 по отдельности в массив

Coğrafi Kuzeyden Kıble Açısı : 246.62 ° dir

2013 Senesi Ortası İçin Sapma Açısı : 4.87 ° dir

Pusula Kuzeyine Göre Kıble Açısı : (246.62) - (4.87) = 241.75 ° dir.
0
Leroy
# Leroy 20.02.2013 20:12
if(preg_match_all('#[\d]+\.[\d]+#',$text,$list))
foreach($list as $dig)
echo $dig;


Учите регулярные выражения, хоть я и написал что только с помощью них парсить нельзя, но и совсем без них парсить сложновато
0
Нурбол
# Нурбол 21.02.2013 12:08
Parse error: syntax error, unexpected T_VARIABLE, expecting T_PAAMAYIM_NEKUDOTAYIM in Z:\home\parser\www\inde1x.php on line 5

пишет!

2 дня перечитал все не получается! тестирую на денвере!

http://www.namazvakti.com/QAbout.php?cityID=8408 сайт откуда нужно взять 246.62 и 4.87

помогите пожалуйста! в долгу не останусь!
0
Leroy
# Leroy 21.02.2013 12:20
ну вы хоть код приведите, я же не телепат. Мой код я проверял, он работает
0
Нурбол
# Нурбол 21.02.2013 12:33


include('simple_html_dom.php');



$html = file_get_html('http://www.namazvakti.com/QAbout.php?cityID=8408');



if(preg_match_all('#[\d]+\.[\d]+#',$text,$list))

foreach($list as ­$dig)

echo $dig;
0
Leroy
# Leroy 21.02.2013 12:57
$html = file_get_contents('http://www.namazvakti.com/QAbout.php?cityID=8408');
if(preg_match_all('#[\d]+\.[\d]+#',$html,$list))
print_r($list[0]);
не понятно только, зачем вам simple_html_dom
0
Нурбол
# Нурбол 21.02.2013 13:29
Вопрос решили спасибо сайту! буду заходить и поставлю в закладки)
0
Илья55
# Илья55 25.02.2013 21:46
Подскажите по simple_html_dom. Пробую простые парсеры.

Например:



include_once('C:/Users/Public/Apache/htdocs/Parser/simple_html_dom.php');

echo file_get_html('http://www.yandex.ru/')->plaintext;



Ругется:



PHP Fatal error: Call to undefined function mb_detect_encoding() in C:\Users\Public\Apache\htdocs\Parser\simple_html_d om.php on line 1234
0
Leroy
# Leroy 25.02.2013 22:29
у вас не установлена библиотека php_mbstring.dll, поэтому и не доступна функция mb_detect_encoding. В php.ini нужно добавить строку extension=php_mbstring.dll ну и соответствующая dll должна лежать в папке с расширениями php
0
Илья55
# Илья55 25.02.2013 23:11
Да, включил в php.ini extension=php_mbstring.dll.

Ну а сам php_mbstring.dll у меня лежит в C:\Program Files\PHP\ext, я так думаю это верно.



Подскажите а почему выводятся кракозябры типа:

Секс знакомства ru -

после парсинга
0
Leroy
# Leroy 25.02.2013 23:32
кодировка отличается, ваша и сайта донора
0
Илья55
# Илья55 27.02.2013 18:21
А где это можно исправить,не подскажите?
0
Leroy
# Leroy 27.02.2013 18:24
в настройках браузера)
0
wolflingsu
# wolflingsu 13.05.2013 00:16
Полезно обрабатывать полученный HTML перед его парсингом. В том числе и кодировки:




function prepareForDOM($html, $encoding) {
$html = iconv($encoding, 'UTF-8//TRANSLIT', $html);
$html = preg_replace('/<(script|style|noscript)\b[^>]*>.*?<\/\1\b[^>]*>/is', '', $html);
$tidy = new tidy;
$tidy_config = array(
'drop-font-tags' => true,
'drop-proprietary-attributes' => true,
'hide-comments' => true,
'indent' => true,
'logical-emphasis' => true,
'numeric-entities' => true,
'output-xhtml' => true,
'input-encoding' => 'utf8',
'output-encoding' => 'utf8',
'wrap' => 0
);

$tidy->parseString($html, $tidy_config, $tidy_config['output-encoding']);
$tidy->cleanRepair();
$html = $tidy->value;
$html = preg_replace('#<meta[^>]+>#isu', '', $html);
$html = preg_replace('#<head\b[^>]*>#isu', "<head>\r\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />", $html);

return $html;
}
0
Leroy
# Leroy 13.05.2013 11:10
осталось только узнать что за класс tidy
0
wolflingsu
# wolflingsu 14.05.2013 12:55
Leroy, вы шутите? =)

http://www.php.net/manual/ru/book.tidy.php
0
Илья55
# Илья55 25.02.2013 22:22
Опечатка в Илья55 25.02.2013 18:20: включил extension=php_mbstring.dll а не extension=php_ldap.dll
0
Илья55
# Илья55 25.02.2013 22:52
Подскажите почему при парсинге некоторых сайтов, например yandex,при:



include_once('C:/Users/Public/Ap­ache/htdocs/Parser/si­mple_html_dom.php');

echo ­­file_get_html('http://www.yandex.ru/')->plaintext;



пишет стандартное сообщение:



Этот веб-узел не может отобразить эту страницу

HTTP 500

Возможные причины:

Веб-узел находится в состоянии обслуживания.

На этом веб-узле обнаружена программная ошибка.



Попробуйте сделать следующее:

Повторите ввод адреса.



Перейдите на предыдущую страницу.



Подробнее



Эта ошибка (HTTP 500 - внутренняя ошибка сервера) означает, что на веб-узле, который вы хотите посетить, имеется проблема, препятствующая отображению нужной веб-страницы.



Тое есть у этих сайтов стоит защита от парсера?
0
Leroy
# Leroy 25.02.2013 22:57
т.е. серьезные сайты не стоит парсить file_get_html (который использует file_get_content), используйте cUrl а уже потом результат распарсивайте str_get_html
0
Илья55
# Илья55 25.02.2013 23:00
Спасибо Leroy, уже читаю про cUrl
0
Stan
# Stan 28.02.2013 21:59
Подскажите, как спарсить со страницы Base64, что б обрезало весь текст и теги, оставался чистый Base64, буду очень благодарен
0
Leroy
# Leroy 01.03.2013 11:06
ну чисто теоретически base64 то набор букв и цифр некой длинны, чаще всего это длинна будет большая. Поэтому тут легко справится что-то вроде
if(preg_match_all('#[a-zA-Z0-9]{10,}[=]?#',$data,$result))
print_r(result);
0
Stan
# Stan 01.03.2013 18:26
Спасибо за быстрый ответ! Буду пробывать :)

Отлично написали статью, с нее начал знакомиться с парсингом.
0
Федор
# Федор 02.04.2013 23:32
Добрый день!

Есть задачка:


$o = str_get_html('<a class="some class" onclick="return {"var1":{"var2":"val"},"var3":{}}" href="/some/href/">Text</a>');

var_dump($o);//["attr"]=> array(2) { ["class"]=> string(10) "some class" ["onclick"]=> string(8) "return {" }




Лажа в том, что атрибут href для ссылки получить не удастся... По идее все портит json, но как это обойти?

Есть идеи?
0
Leroy
# Leroy 03.04.2013 02:33
хоть я и написал, что регулярки применять для распарсивания DOM не стоит, для строк лучше их не найти. preg_match('#href="([^"]+)"#',$data,$list) вот и все
0
Guest
# Guest 08.05.2013 15:51
Спасибо! Отличный мануал! Так же порадовал котейка, который просит отключить AdBlock - на мне сработало :)
0
grarnik
# grarnik 14.05.2013 15:56
Спасибо. Помог)
0
Comeonandroid
# Comeonandroid 23.05.2013 08:26
Помогите, никак не могу заставить работать ваш парсер в нынешних условиях. Получилось скачать 30 картинок подставив нужные теги div.b-images-item__wrap img вместо div.b-image img, но вот получить ссылку на дальнейший поиск никак не удается, я нашел её в исходном коде, она в этом элементе если жать на неё из браузера со страницы исходного кода все нормально, но как я не пробовал запихнуть её в парсер следуя инструкциям ничего ен получается
0
nisampurger
# nisampurger 26.05.2013 17:53
у меня есть xml файл вот с таким содержанием:



...



...



как получить с помощью Simple HTML DOM значения атрибутов Code, HighPic, Title?

Заранее благодарен :)
0
nisampurger
# nisampurger 26.05.2013 17:57
...

Product Code="1" HighPic="namepic.jpg" Title="titleproduct"

...
0
Евгений
# Евгений 24.06.2013 10:33
Здравствуте, совсем новичок в php

Подскажите, взял такой скрипт:


require_once 'simple_html_dom.php';
$data = file_get_html('http://turbo-tor.com/all-foto-rewievs/');
if($data->innertext!='' and count($data->find('.entry-content a img'))){
foreach($data->find('.entry-content a img') as $b){
echo '<a href="" rel="rr" onclick="return jsiBoxOpen(this)" title="">'.$b.'</a>';
}
}


Хочу в htef="" подставить адрес картинки, но у меня не выходит.

Не могу правильно составить поиск и вытянуть в href.

Как правильно это сделать?

Спасибо.
0
Leroy
# Leroy 24.06.2013 11:35
ну у img нет href, у него есть только src
echo '<a href="'.$b->src.'" rel="rr" onclick="return jsiBoxOpen(this)" title="">'.$b.'</a>';
0
Евгений
# Евгений 25.06.2013 00:02
сорри, неправильно выразился, в $b сама картинка, отлично выводится,

нo в href мне надо поместить не src img, а адрес ссылки в которую заключен сам тег img.

тоесть парсю вот это:

<a href="http://turbo-tor.com/wp-content/uploads/2013/06/1212.png"  data-slb-group="240" data-slb-active="1" data-slb-internal="0">
<img class="alignnone size-medium wp-image-222" alt="1212" src="http://turbo-tor.com/wp-content/uploads/2013/06/1212-300x232.png" width="300" height="232"/>
</a>


просто примеров не нашол, либо не внимательно смотрел, как высунуть в одном цыкле вывести две переменные и подставиь их.

Получаеться img есть, а как второй парсинг подставить и правильно вытянуть, не могу.



0
Leroy
# Leroy 25.06.2013 03:30
невнимательно читали

$b->parent() Возвращает родительский элемент.

$b->parent() ->href
0
Евгений
# Евгений 25.06.2013 08:09
Огромное спасибо!
0
doctor
# doctor 01.07.2013 21:26
Подскажите пожалуйста, а как парсить разные значения и забивать их в массив, т.е. span class=today и span class=wday в массив с ключем 1, а все остальное к примеру td class=time, так как первые меняются, а последующие повторяются?
0
Leroy
# Leroy 02.07.2013 00:59
ничего не понял
0
doctor
# doctor 02.07.2013 08:06
Вот код для примера:

<span class=today>Понедельник 22 июня</span><td class=time>11 ч.</td><span class=wday>Вторник 23 июня</span><td class=time>12 ч.</td>


значения span с классами today, wday нужно найти и поместить в:

$arr_info[0][$i]


значения td с классом time нужно найти и поместить в:

$arr_info[1][$i]
0
Leroy
# Leroy 02.07.2013 11:46
$i = 0;
foreach($data->find('span.today') as $today){
$arr_info[0][$i] = $today->innertext;
$arr_info[1][$i++] = $today->next_sibling()->innertext;
}
0
Ibo_Sher
# Ibo_Sher 08.07.2013 16:54
Добрый день подскажите как передать в парсер класс, если его имя содержит пробел? Нпример
0
Leroy
# Leroy 08.07.2013 17:07
я писал об этом a[class=class1 class2]
0
Парсер
# Парсер 04.01.2015 21:50
Класс не может содержать символа пробела.

Можно искать по одному из классов которые прописаны в атрибуте class.

К примеру


<a href="#" class="class1 class2">Some link</a>

можно найти


$dom->find('a.class1', 0);
0
Виталий
# Виталий 16.07.2013 06:27
Добрый день, встретился с такой проблемой - есть сайт с таблицей в 1й колонке идут картинки, во второй артикул, в третьей текст, необходимо парсить только те картинки у которых во второй колонке идентичный артикул. До этого не занимался подобными вещами, но тут иначе ни как. Уже голова квадратная от всего этого... Буду признателен за помощь!
0
Leroy
# Leroy 16.07.2013 11:43
$today->next_sibling() $today->prev_sibling()
0
Виталий
# Виталий 17.07.2013 05:48
Благодарю)
0
Андрей
# Андрей 29.07.2013 03:22
Спасибо за статью.

Но тем не менее столкнулся с проблемой:

Пробуем парсить html:


<html>
<head>
<title>Тексты песен. Слова к песням, скачать бесплатно музыку в mp3</title>
<meta name="description" content="база текстов песен, слова к песням исполнителей музыки" />
<meta name="keywords" content="тексты песен, текст песни, слова к песне, скачать бесплатно" />
<meta http-equiv=Content-Type content="text/html;charset=windows-1251" />
<meta http-equiv="content-language" content="ru" />
</head>
<body>

<div align="center">

</div>


</body>
</html>




Для этого использую:


function prepareForDOM($html, $encoding) {
$html = iconv($encoding, 'UTF-8//TRANSLIT', $html);
$html = preg_replace('/<(script|style|noscript)\b[^>]*>.*?<\/\1\b[­^>]*>/is', '', $html);
$tidy = new tidy;
$tidy_config = array(
'drop-font-tags' => true,
'drop-proprietary-attributes' => true,
'hide-comments' => true,
'indent' => true,
'logical-emphasis' => true,
'numeric-entities' => true,
'output-xhtml' => true,
'input-encoding' => 'utf8',
'output-encoding' => 'utf8',
'wrap' => 0
);

$tidy->parseString($html, $tidy_config, $tidy_config['output-encoding']);
$tidy->cleanRepair();
$html­= $tidy->value;
$html = preg_replace('#<meta[^>]+>#isu', '', $html);
$html = preg_replace('#<head\b[^>]*>#isu', "<head>\r\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />", $html);

return $html;
}

$answer_m = file_get_contents('newhtml.html');
$answer_m = prepareForDOM($answer_m, 'cp1251');
$html = str_get_html($answer_m);
$lets = $html->find('div');




Два момента интересны:

1. Если не заменять(закоментить prepareForDOM) то выдает ошибку

arning: mb_strpos() [function.mb-strpos]: Offset not contained in string ... on line 1570



2. Даже после предварительной обработки div не находится. $lets - пустая на выходе.



Очень надеюсь на вашу помощь. Сам уже и не знаю что делать - на другую библиотеку что-ли переходить...
0
Андрей
# Андрей 29.07.2013 10:41
1. - так и не понятно почему так

2. если убрать элемент русский текст из title, то работает нормально, даже если русский текст есть в теле страницы.
0
Leroy
# Leroy 29.07.2013 11:37
похоже великий и могучий ПолтерГейц)))
0
ev-peregudov
# ev-peregudov 18.08.2013 22:48
Всё круто. Но возникла проблема. Пытаюсь спарсить содержимое

Форматирование теряется, нет перехода на новые строки. Скажите, пожалуйста, как исправить?
0
ev-peregudov
# ev-peregudov 18.08.2013 22:51
содержимое тега pre
0
regexp
# regexp 27.08.2013 15:41
пример в начале статьи не корректен:
0
regexp
# regexp 27.08.2013 15:43
Всю регулярку порезали

'/<a\s+href=”([^”]+)”\s*>(.*?)<\/a>/'
0
Leroy
# Leroy 27.08.2013 18:40
да? а если юзер добавит вашей ссылке стилей
<div><a style="bla" href="http://xdan.ru"><div>Сайт по программированию парсеров</div><div> и многое другое</div></a></div>


к любому конкретному примеру можно подобрать регулярку, но стоит слегка отойти от это примера и все сломается. simple_html_dom такие перепады не страшны
0
Максим
# Максим 05.10.2013 05:32
Как правильно работать если страница большая слишком. Мне надо спарсить карту сайта на огромном портале..
0
Сергей
# Сергей 16.10.2013 21:39
А как парсить много страниц?
Допустим есть сайт site.com
на нем 100 ссылок. И на каждой из тех ссылок еще по 20 ссылок. Получается мне нужно спарсить 2000 страниц в 1 базу. Допустим картинка, описание, телефон.

Второй вопрос: Как парсить только новую информацию на сайте. Например на сайте СМИ обновляются статьи. Я хочу заходить туда раз в сутки(через cron) и забирать только новые статьи в свою базу(а так же если какая то статья из старых обновилась на сайте то ее тоже обновить у себя).

Третий вопрос: Как работать через proxy?

Вообщем хочу для себя создать мощный парсер(с PHP, mysql, HTML работаю давно). Статья лучшая что пока находил по парсерам. НО у меня даже тот пример с Джесикой альбой не получился. Я просто скопировал код и всеравно пустая страница.
0
Leroy
# Leroy 17.10.2013 17:38
Также и парсить. Циклами и рекурсиями, перебирать все ссылки. грузить их в отдельный объект, также распарсивать и их.

Чтобы знать какие статьи у вас новые, надо запоминать старые. Я обычно если парсил статью, в отдельное поле складывал md5(ее урл) потом сравнивал. Если в базе уже есть такой хеш, то не грузил статью.

Через прокси умеет работать curl
0
Armen
# Armen 22.10.2013 13:31
добрый день пытаюсь с помощью вашего шаблона сделать парсер для сайта aliexpress.com. но вот на последнем выводе описания почему то не получается вывести

код:

0
Armen
# Armen 22.10.2013 13:32
<?php
require_once 'simple_html_dom.php';

//url poiska//
$link= file_get_html('http://www.aliexpress.com/store/product/Beats-Audio-Original-phone-HTC-ONE-V-T320e-4G-ROM-WIFI-GPS-5MP-3G-GSM-smartphone/901395_1100253986.html');
$html = str_get_html("$link");

//poisk naxvania tovara <h1> na stranice//
if(count($html->find('h1')))
foreach($html->find('h1') as $title)

//udalyaet vse tegi ostavlyaet tolko tekst//
$w=$title->innertext;

//udalyaet nenujnie slova is teksta//
$endtitle=str_replace(array('shipping', 'smartphone', 'mobile', 'Original', 'free', 'phone', 'GSM', '8MP', '5MP', '3.2MP', '2MP', 'GPS', 'WIFI', 'Wifi', 'ROM', 'RAM', '32G', '16G', '8G', '4G', '3G', '2G', '32g', '16g', '8g', '2g', '3g', '4g', 'new', 'unlocked', 'NEW', 'New', 'brand', 'Brand', 'smartphne','internal','cell', 'big', 'sale', 'In stock', 'HK post', 'Camera', 'camera', 'factory', '100%'), '', $w);

//vivod gotovogo teksta//
echo $endtitle.'(UNLOCKED ORIGINAL NEW)';

//poisk i vivod ceni//
if(count($html->find('span[itemprop=lowPrice]')))
{foreach($html->find('span[itemprop=lowPrice]') as $price)
echo '<br>'.$price;}
else{
foreach($html->find('span[id=sku-price]') as $price)
echo '<br>'.$price;
}

//poisk i vivod ceni//
foreach($html->find('h2[class=description]') as $pr)
echo '<br>'.$pr;


?>
0
Leroy
# Leroy 22.10.2013 17:38
ну по хорошему все же нужно echo $price->innertext;
0
Armen
# Armen 22.10.2013 19:39
аа ну да,

а как на счет h2[class=description]?
0
Leroy
# Leroy 22.10.2013 19:53
а откуда вы вообще взяли этот h2? в странице нет такого тега, как и класса description
0
Armen
# Armen 22.10.2013 20:30
h2 выводит только Product Description. оттуда начинается описание товара.

"Beats Audio Original phone HTC ONE V T320e 4G ROM WIFI GPS 5MP 3G GSM smartphone free shipping

Product description:



General 2G Network GSM 850 / 900 / 1800 / 1900

3G Network HSDPA 850 / 900 / 2100

SIM Mini-SIM



Announced 2012, February

Status Available. Released 2012, April

Body Dimensions 120.3 x 59.7 x 9.2 mm (4.74 x 2.35 x 0.36 in)

Weight 115 g (4.06 oz)

Display Type Super LCD2 capacitive touchscreen, 16M colors

Size 480 x 800 pixels, 3.7 inches (~252 ppi pixel density)

Multitouch Yes " и т.д.



как вывести именно это описание до картинок? после этого описания выходят картинки.
0
Leroy
# Leroy 22.10.2013 20:44
понял наконец. не внимательно читали
echo $html->find('h2[class=description]',0)->next_sibling()->innertext
0
Armen
# Armen 22.10.2013 20:51
спасибо за быстрый ответ, до все равно не отображает. выдает пустоту.(
0
Armen
# Armen 22.10.2013 21:19
данный код выдает ошибку :

"Fatal error: Call to a member function next_sibling() on a non-object in Z:\home\test1.ru\www\index.php on line 32"

32 линия и есть эта линия что вы написали.
0
Leroy
# Leroy 22.10.2013 21:27
зачем
$link= file_get_html('...'); 
$html = str_get_html("$link");


когда достаточно
$html= file_get_html('...');


во сторых в html похоже ошибка, и найти он его не может. h2.desc... нет в дом. Парсите этот кусок регуляркой. только не спрашивайте какой.
0
Armen
# Armen 22.10.2013 19:40
h2[class=description] никак не отображает нужную информацию, а вроде все правильно делаю....
0
Armen
# Armen 22.10.2013 19:45
вообще то надо вывести описание которое после h2[class=description] идет тоже. т.е. получается div[id=custom-description]
0
Hrefs
# Hrefs 08.11.2013 00:44
Подскажите, как сделать выборку, если на нужной мне странице стоит тег:

<td class="alt1" colspan="2">


и мне нужно сделать выборку именно по нему, так как нужный текст на странице встречается только после него.

Например я делаю так:

foreach($html->find('td[class="alt1" colspan="2"] ') as $element1) 
echo $element1;


Но ничего не выводится

А если делать так:

foreach($html->find('td[class="alt1"] ') as $element1) 
echo $element1;


то выводится ненужный мне текст, так как тег
<td class="alt1">
встречается на странице несколько раз.

Вариант с указанием позиции тега так:

foreach($html->find('td[class="alt1"] ', 2) as $element1) 
echo $element1;


тоже не подходит, так как нужный текс может встречаться на страницах под разной позицией.
0
Hrefs
# Hrefs 08.11.2013 00:52
Предыдущий пост коряво отобразился

Подскажите, как сделать выборку, если на нужной мне странице стоит тег:



и мне нужно сделать выборку именно по нему, так как нужный текст на странице встречается только после него.

Например я делаю так:

foreach($html->find('td[class="alt1" colspan="2"] ') as $element1)

echo $element1;

Но ничего не выводится

А если делать так:

foreach($html->find('td[class="alt1"] ') as $element1)

echo $element1;

то выводится ненужный мне текст, так как тег встречается на странице несколько раз.

Вариант с указанием позиции тега так:

foreach($html->find('td[class="alt1"] ', 2) as $element1)

echo $element1;

тоже не подходит, так как нужный текст может встречаться на страницах под разной позицией.
0
Leroy
# Leroy 08.11.2013 02:18
foreach($html->find('td[class="alt1"] ') as $element1)
if( $element1->colspan="2" ){
echo $element1;
break;
}
0
Hrefs
# Hrefs 08.11.2013 05:15
Спасибо, но все равно отображается не то что нужно.

Вот пример html кода http://i-css.ru.s3.hhos.ru/example.txt

Там только один раз встречается тэг
<td class="alt1" colspan="2">


И нужно спарсить сразу то что следует за ним:
<span class="smallfont"><a href="member.php?u=37470">RixerBox</a>, <a href="member.php?u=32875">Bloomer</a></span>


Но ничего не выходит :(
0
Hrefs
# Hrefs 09.11.2013 19:30
UPD: уже нашел решение, регулярным выражением оказалось проче чем с использованием Simple-HTML-DOM
0
barbarisa
# barbarisa 31.12.2013 00:56
На редкость качественный материал. Спасибо!
0
Замонбек
# Замонбек 08.01.2014 03:48
добрый вечер друзя !

Я хочу парсит сайт ism.uz но столькнуля проблемой не ругайтес ёще я новичок в этом деле ))

Например я хочу парсит страницу http://ism.uz/letter/f/ ну там много ссылок,как парсит эти ссылки? ато не хочу войти каждуйу ссылку и парсит ))
0
DarkBioloG
# DarkBioloG 14.02.2014 16:55
А как можно спарсить параметр "herf" из тега "a" чтобы он был в формате URL?
0
Арсен
# Арсен 04.03.2014 23:29
А как парсить пагинацию, например есть лишка с классом "current", нужно достать следующею лишку. Спасибо.
0
Навка
# Навка 16.03.2014 05:06
Да продлятся твои дни, добрый человек! И только здесь я нашла как именно подключать эту библиотеку! Везде пишут -подключите... Спасибо еще раз!!!
0
Навка
# Навка 16.03.2014 05:43
Спасибо!! только здесь нашла, как именно нужно подключать это либу! Нигде не могла найти)) И весь урок супер, спасибо!!!
0
Navka
# Navka 30.03.2014 06:18
Спасибо за статью))) очень полезно и просто. Остался один вопрос. Вы пишите: "Думаю никому в здравом уме, не придет в голову парсить Яндекс с помощью file_get_content." Поэтому собственно и вопрос: а чем надо парсить поисковики? И почему file_get_content не катит?
0
Leroy
# Leroy 30.03.2014 15:36
поисковики, как и многие умные сайты предпочитают работать не с ботами а с живыми людьми. поэтому проверяется все: наличие кукиес, реферал, операционка, версия браузера, разрешение экрана, некоторые даже анализируют поведение пользователя на странице. Для одного, особо умного сайта, мне пришлось изображать с помощью js на сайте некую деятельность. Прокрутку экрана. По ссылкам парсер не просто переходил а кликал на них.

Большинство сайтов можно спарсить с помощью curl однако в более сложных случая приходится эмулировать браузер (IE COM PHP) или других хитрых методов
0
Denis
# Denis 04.04.2014 14:36
Здравствуйте. Прежде всего хочу сказать огромное спасибо за очень полезную и качестаенную статью.

Я новичек в php и вообще в программировании в целом, меня всегда интересовал этот вид ТВОРЧЕСТВА и сейчас мне необходимо сделать парсер который удовлетворял бы моим требованиям и спомощью данной статьи я боюсь что это у меня получится.

Собственно вопрос заключается в следующем.

мне необходим парсер каторый мог бы забирать
<iframe>
теги из
id="mediaEmdebCodeInput"
например с xvideos[dot]соm с помощью метода find. Хотелось бы узнать правельный ли у меня ход мысли или это лучше реализовать с посощью других методов. Еще раз Большое спасибо за статью и заранее благодарю Вас за ответ.
0
Сергей
# Сергей 06.05.2014 09:36
Здравствуйте, добрый Человек!

Я новичок, поэтому не серчайте, пожалуйста! :)



Не могли бы Вы подсказать, как получить данные в следующем примере:



Есть таблица:

<table width=820 cellspacing=1 cellpadding=3 border=0>


<tr bgcolor="#C0C0C0" align=right>
<td>Проход</td>
<td>Прибыль</td>
<td>Всего сделок</td>
<td>Прибыльность</td>
<td>Матожидание</td>
<td>Просадка $</td>
<td>Просадка %</td>
</tr>

<tr align=right>
<td title="данные 1">номер строки 1</td>
<td class=mspt>Прибыль строки 1</td>
<td>Всего сделок строки 1</td>
<td class=mspt>Прибыльность строки 1</td>
<td class=mspt>Матожидание строки 1</td>
<td class=mspt>Просадка $ строки 1</td>
<td class=mspt>Просадка % строки 1</td>
</tr>


<tr align=right>
<td title="данные 2">номер строки 2</td>
<td class=mspt>Прибыль строки 2</td>
<td>Всего сделок строки 2</td>
<td class=mspt>Прибыльность строки 2</td>
<td class=mspt>Матожидание строки 2</td>
<td class=mspt>Просадка $ строки 2</td>
<td class=mspt>Просадка % строки 2</td>
</tr>

</table>



Есть код, которые не работает к сожалению, а по идее должен был бы работать, но, видимо, я ошибаюсь в чем-то, а в чем понять пока не могу:


include("simple_html_dom.php");
$file = 'OptimizationReport.html'; //тут находится таблица

$html = str_get_html($file);


foreach($html->find('tr') as $k => $tr)
{
foreach ($tr->find('td') as $kk => $td)
{
$array[$k][$kk] = $td->plaintext;
}
}




в массив ничего не заносится к сожалению.

Не могли бы подсказать, что не так делаю?



Благодарю!
0
Сергей
# Сергей 06.05.2014 09:37
Ой, прошу прощения, 2 раза отправилось...
0
Leroy
# Leroy 06.05.2014 12:06
­str_get_html($file); // берет данные из строки.

Вам нужна file_get_html как минимум
0
Maxim
# Maxim 18.05.2014 15:56
А что делать, если атрибут class содержит пробелы??
0
Leroy
# Leroy 19.05.2014 11:11
вопрос уже поднимался. find('class="class1 class2"')
0
HiPutler
# HiPutler 02.06.2014 18:59
Насколько подобный метод парсинга нагружает сервер-донора, учитывая то что парсится множество страниц в цикле? Обязательно ли прибегать в таком случае к мультипотокам и прокси?
0
Leroy
# Leroy 02.06.2014 22:41
можно поставить паузу между парсингом
sleep(3)//задержка на 3 секунды
мультипоточный парсинг описан здесь прокси использовать по необходимости, если сервер жестко режет все по ip, в большинстве серьезных кантор это не так. банят по умному, эвристически
0
HiPutler
# HiPutler 03.06.2014 08:25
Вот спасибо большое добрый программист. И за статью и за совет.
0
DemonIa
# DemonIa 16.07.2014 18:14
Всем привет. Подскажите, почему вот такой код:
foreach($html->find('a[href*=http]') as $link)
echo $link.'
';
возвращает объект? Я же нигде не указывал индексы, т.е должен быть массив. Мне нужно результат работы парсера записать в csv файл, а функция fputcsv, что очевидно, не может принимать объект. Как быть? Спасибо
0
Boarworm
# Boarworm 26.07.2014 17:32
Добрый день, решил сделать бота для сайта накрутки лайко, подписчиков и т.д. Авторизацию проходит нормально, заходит на нужную страницу. Далее нужно перейти по ссылке на которой нужно ставить лайк, ссылка вида http://vk.com/............. Я так понимаю нужно спарсить ссылки такого вида, а потом переходить по ним. Пробую так:
$data  = ­file_get_html('http://site.com/user/likes/');
но парсится страница http://site.com/ Может нужно куки как-то передавать?
0
Dmitriy
# Dmitriy 03.08.2014 01:28
Здравствуйте! А подскажите, как парсить сайт, требующий регистрацию? У меня есть логин пароль, но парсер то зайти через них не может, как быть?
0
Leroy
# Leroy 03.08.2014 20:30
http://xdan.ru/avtorizacija-na-sajte-pri-pomoshhi-curl-php.html
0
Валера
# Валера 29.08.2014 19:30
а как строить большой массив? я например хочу взять все ссылки из меню как главные категории и сохранить? затем к этому массиву добавить элементы?

я пробую

$rated = array();

$main_cats = $html->find('.big_menu a');

$rated['main_cats'] = $main_cats;

print_r($rated);

у меня какая-то жесть выводится а не мой массив
0
Leroy
# Leroy 29.08.2014 21:20
$rated['main_cats'] = array();
foreach($­data->find('.big_menu a') as $a)
$rated['main_cats'][] = $a->href;
0
Валера
# Валера 29.08.2014 20:04
и еще, пытаюсь добраться до всех li

http://imagizer.imageshack.com/img538/5411/R6gpci.png



foreach($data->find('div.top_menu div.inner ul') as $ul)

{

foreach($ul->find('li') as $li)

{

echo $li;

}

}



но ничего не находит
0
Leroy
# Leroy 29.08.2014 21:21
в указанном коде все верно, ищите ошибку выше
0
Andrew
# Andrew 03.09.2014 14:44
Добрый день!

Спасибо за ваш сайт, нашел много полезного.



В парсинг окунулся пару дней назад, знаний мало.

Я спарсил таблицу:

require('simple_html_dom.php');
$html = file_get_html('http://test.com/');
$table = $html->find('table', 0);
$rowData = array();

foreach($table->find('tr') as $row) {
$flight = array();
foreach($row->find('td') as $cell) {
$flight[] = $cell->innertext;
}
foreach($row->find('th') as $cell) {
$flight[] = $cell->innertext;
}
$rowData[] = $flight;
}

echo '<table>';
foreach ($rowData as $row => $tr) {
echo '<tr>';
foreach ($tr as $td)
echo '<td>' . $td .'</td>';
echo '<td>' . $th .'</td>';
echo '</tr>';
}
echo '</table>';



В таблице присутствуют ссылки. От них мне нужно избавится.

Когда ставлю вместо innertext - plaintext, то ссылки уходят, но так же уходят и картинки, которые присутствуют в таблице, поэтому такой вариант не подходит.



Прошу помощи, заранее спасибо.
0
Фототехник
# Фототехник 09.09.2014 03:36
Можно просто убрать ссылки через css
0
Andrew
# Andrew 15.09.2014 21:57
Как?

Подскажите, пожалуйста!
0
Leroy
# Leroy 16.09.2014 19:15
Это он глупость сказал, в ветке ниже есть пример удаления тега h2, замените на a и будет вам счастье
0
Фототехник
# Фототехник 19.09.2014 00:55
Ну почему же, просто не так выразился*, ссылку можно скрыть с помощью css, Часто так делают на бесплатном хостинге который принудительно вставляет ссылку рекламы.
0
Andrew
# Andrew 22.09.2014 14:17
Извиняюсь, но можете написать готовый код?) Буду очень благодарен!)
0
Leroy
# Leroy 22.09.2014 18:28
foreach($data->find('a') as $a){
$a->outertext = ­'';
}
0
serg47
# serg47 09.09.2014 02:09
помогите пожалуйста. Есть такой кусок:

<div class="slide-content">
<h2 class="slide-title"><a href="http://myautumn.ru/pesni/ohochinskij-yurij-dozhdlivyj-london.html" title="Permalink to Охочинский Юрий &#8212; Дождливый Лондон" rel="bookmark">Охочинский Юрий &#8212; Дождливый Лондон</a></h2>Вот и в Лондон нагрянула осень! Все укрыл бесконечный туман. Ветер листья куда-то уносит. За душой любовь и обман.</div>

Подскажите как выбрать текст после закрывающего тега</h2>?
0
Leroy
# Leroy 09.09.2014 13:19
удалить h2, потом дернуть то, что осталось
0
serg47
# serg47 10.09.2014 02:17
Спасибо за ответ!


include 'simple_html_dom.php';
$data = file_get_html('http://yyyyyyu.ru');
foreach($data->find('.slide-content') as $main){
$b=$main->find('h2');
$b->outertext = '';
echo "$main->plaintext";
}


Пытаюсь так, но не получается. Пните в нужном направлении! Заранее спасибо!
0
serg47
# serg47 10.09.2014 16:14
Если кому интересно "докумекал" рабочий вариант :


include 'simple_html_dom.php';
$data = file_get_html('http://myautumn.ru');
foreach($data->find('.slide-content') as $main){
$b=$main->find('h2',0);
$b->outertext = '';
echo $main->innertext.'<br /><br />';
0
RomHunter
# RomHunter 17.09.2014 13:47
Отличная статья, спасибо!
0
blackx1
# blackx1 19.09.2014 00:58
Спасибо, хорошая статья

Только вот интересно когда такой случай

Когда есть к примеру " <b>Название: </b>Название1<br />"

Как вытянуть "Название1"?
0
Leroy
# Leroy 19.09.2014 11:37
К сожалению никак, через библиотеку этого не сделать. Нужно как-то брать корневой для этих тегов элемент и уже анализировать его содержимое через регулярные выражения. Вообще, для парсинга хоть я и написал, что регулярки не очень удобны, но в отдельных случаях они незаменимы.
0
irirni
# irirni 27.09.2014 23:00
Спасибо за статью!
0
Oleg
# Oleg 29.09.2014 14:12
Добрый день! Спасибо за библиотеку. Немного разобраться не могу в ней. Требуется из примерно такого хтмл кода дернуть нужный текст и нужные ссылки

<div id="bar"><ul>

<li><a href="/zakon/2014/">не нужная ссылка 2014</a></li>

<li><a href="/">не нужная ссылка</a></li>

<li><a href="/zakon/">не нужная ссылка</a></li>

<li><a href="/catalog/">не нужная ссылка</a></li>

<li><a href="/forum/">не нужная ссылка</a></li>

</ul></div>

<div><a href="/info/423/">нужная ссылка</a></div>

<div>нужный текст</div>

<div>нужный текст</div>

<div style="margin-top: 10px"></div>

<div><a href="/info/472/">нужная ссылка</a></div>

<div>нужный текст</div>

<div>нужный текст</div>

<div style="margin-top: 10px"></div>

<div><a href="/info/732/">нужная ссылка</a></div>

<div>нужный текст</div>

<div>нужный текст</div>

<div style="margin-top: 10px"></div>



в пхп прописываю так:

$data_ooo = file_get_html($arr_city[27]);
if($data_ooo->innertext!='' and count($data_ooo->find('a'))){
foreach($data_ooo->find('a') as $c){
$b = $c->find('li,ul',0);
$b->outertext = '';
//$data_ooo->innertext;
echo '<a href="http://www.vutil.ru'.$c->href.'">'.$c->plaintext.'</a></br>';
//echo $c->innertext;
}
}




но что то не выходит, помогите плиз!
0
Парсер
# Парсер 04.01.2015 21:47
Прочитайте про DOM и HTML.

Вы сначала получаете список тегов <a>, а потом в них ищете <li> хотя в HTML которые вы привели в качестве примера во всех тегах <a> только текст.



Смысл самого кода написанный вами непонятный.
0
Сергей Пил
# Сергей Пил 29.11.2014 10:39
Здравствуйте написал вот такой парсер.


<?php
//ставим лимит памяти больше, т.к. библиотека затратна к ресурсам
ini_set('memory_limit', '128M');
//так же ставим больше время сессии
set_time_limit(800);
//начинаем сессию
session_start();
require_once 'simple_html_dom.php';
$data = new simple_html_dom();
$data = file_get_html('http://www.mon.gov.ua/ua/news');
if($data->innertext!='' and count($data->find('aside#leftSideBar'))){
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Тег А, атрибут target</title>
</head>
<body><?
foreach($data->find('div.standartBlock') as $aside){
$aside = preg_replace("/[\n\r\t]/", '', $aside); // замена символов перевода строки и табул¤ции на пробел
$aside = preg_replace("/[ ]{2,}/", '', $aside); // замена более 2х пробелов на один

$div ='<div class="data">';// готовим для даты подмену шаг 1
$div1 ="</div>";// готовим для даты подмену шаг 2
$today = $div. date("d.m.y"). $div1;// готовим для даты подменушаг 3
$aside = preg_replace('/\<span class\="date"\>(.+)\<\/span\>/is', $today, $aside);// замена класса даты на текушюю
$aside = preg_replace('/\<div class\="standartBlock stBlockBlue\">(.+)\<\/div\>/is', '', $aside);
$aside = preg_replace('/\<div class\="image\">(.+)\<\/div\>/U', '', $aside);
$aside = str_replace('<span>', '', $aside);
$aside = str_replace('</span>', '', $aside);
$domain = "http://www.mon.gov.ua";
$new = preg_replace('#(<a href=")(.*)(">)#', "$1$domain$2$3", $aside);


echo $new;
}
}
//освобождаем ресурсы
$data->clear();
unset($data);
?>

Всё в роди нормально, но хочу чтобы можно было указывать определённое количество новостей, кто знает подскажите пожалуйста.
0
Елена
# Елена 11.12.2014 15:48
Не пойму что делаю не так.


ini_set('display_errors', 1);
ini_set('mbstring.func_overload', 0);

// example of how to use basic selector to retrieve HTML contents
include($_SERVER['DOCUMENT_ROOT'].'/simple_html_dom.php');


// get DOM from URL or file
$html = file_get_html('http://yandex.com/images/search?text=%22odeonlight%22+2553%2F7+ODL13+004+%D0%B1%D1%80%D0%BE%D0%BD%D0%B7%D0%B0+%D0%9B%D1%8E%D1%81%D1%82%D1%80%D0%B0++E14+7*40W+Rika&itype=&nojs=1&rpt=image&tld=com');


/*echo '<pre>';
print_r($html);
echo '</pre>';*/

$ret = $html->find('img');
echo '<pre>';
print_r($ret);
echo '</pre>';

В переменной $ret ноль. Я ставила другие теги. Так же всё по нулям. Точнее ищет только html тег
0
Парсер
# Парсер 04.01.2015 21:39
Вы сами перейдите по той ссылке что указали в


$html = ­file_get_html('http://yandex.com/images/search?text=%22odeonlight%22+2­553%2F7+ODL13+004+%D0%B1%D1%80%D0%BE%D0%BD%D0%B7%D0%B0+%D0%9B%D1%8E%D1­%81%D1%82%D1%80%D0%B0++E14+7*40W+Rika&itype=&nojs=1&rpt=im­age&tld=com');

Вообще блок с картинками отдается AJAX запрсом, поэтому тут таким простым подходом не ограничишься.
0
Парсер
# Парсер 04.01.2015 21:37
В своем коде я так же чищу и полученные элементы, к примеру


$a->clear();

потому что из-за них память тоже засоряется
0
VASILIYYY
# VASILIYYY 26.02.2015 01:23
Отличная статья! Скажите, а если при получении html страницы она очень велика - несколько миллионов символов, библиотека просто отказывается ее обрабатывать, какие есть варианты решения проблемы? При этом если получать страницу курлом и сразу кидать ее на вывод, она выводится, так что дело именно в simple html dom. Спасибо.
+1
Leroy
# Leroy 26.02.2015 07:44
как вариант выдирать регуляркой нужный кусок текста и уже его скармливать библиотеке.
+1
Валерий
# Валерий 26.02.2015 05:44
Полезная статья! А не подскажите, можно ли из элемента код распарсить код, либо получить значение конкретной переменной этого скрипта (основная цель этого упражнения)?
К примеру, на загружаемой странице есть скрипт ниже:

var flashvars = {
uid: 'videoplayer',
file: 'http://',
poster: 'http://...jpg',}
var params = {
bgcolor: '#000', ...}

$html = file_get_html('http://пример.php'); //Загружаю страницу
foreach($html->find('script') as $element) //парсю все скрипты
echo $element->plaintext . ''; //а дальше не знаю как вывести код скрипта, либо вывести значение переменной flashvars:file
Можно ли такое проделать с этим парсером?
0
Валерий
# Валерий 26.02.2015 05:47
*речь об элементе < s c r i p t > код < / s c r i p t >
0
Leroy
# Leroy 26.02.2015 07:47
нет. содержание элемента это не задача этой библиотеки. Содержание нужно распарсивать уже регулярным выражением, т..е. в вашем случае примерно так
if(preg_match('#file:'(.*)',#Uus', $element->plaintext, $list)) {
echo $list[1];
}
0
Валерий
# Валерий 26.02.2015 08:01
Спасибо за ответ! Да, похоже только регулярными выражениями можно распарсить содержание скрипта и выдернуть значение переменной.
0
cookie
# cookie 11.03.2015 20:41
Я не понял как соединять результаты ответов, в плане, что я хочу одним скритом найти ссылку, а уже потом парсить информацию по этой ссылке. Мне выкидывает ошибку. Что делать?
0
Andrey
# Andrey 14.03.2015 03:56
Спасибо Вам огромное!

У меня вопрос:

Можно ли в выборке попросить чтобы название класса начинолось на x и кончалось на y?

Что-то вроде этого:

div[class^=x && $=y]
0
campusboy
# campusboy 14.03.2015 08:52
Я новичкок, возможно, глубоко не смог разобраться, но эта библиотека не дала мне решения в задаче. Были на сайте блоки DIV, у которых был класс типа text_523547. Мне нужно было не только парсить текст внутри блоков, но и сохранять в базу вот это число именно. Библиотекой не смог, сделал на регулярках. И ещё не понравилось. К примеру, на странице есть одна ссылка, я нахожу её библиотекой и помещаю в переменную. Потом через var_dump хочу посмотреть, что внутри. В общем, 4ГБ моей ОЗУ оказалось недостаточным, чтобы просмотреть на экране через ХРОМ, что же есть внутри. Там куча хлама. А для новичка важно наглядно видеть, что внутри переменной, чтобы потом оперировать с данными. В итоге, регуляркой решил вопрос (и удобно смотреть что внутри переменных), плюс она работает в среднем 0,5 секунды, когда библиотека в среднем 0,7-1сек.
0
Дмитрий Николаев
# Дмитрий Николаев 22.04.2015 15:42
Добрый день,очень буду благодарен если толкнете в правильном направлении реализации задуманного.
Есть сайт с авторизацией,авторизированому пользователю доступен контент на определенной странице этого сайта,часть этого контента автоматически обновляется 1 раз в час,необходимо разместить часть этого контента на странице другого сайта с теми же функциями автоматического обнавления.

Хожу вокруг да около,вроде рядом,но не могу понять как реализовать.
0
Leroy
# Leroy 23.04.2015 09:44
Вот тут http://xdan.ru/avtorizacija-na-sajte-pri-pomoshhi-curl-php.html почитайте. То что вам нужно
0
Andrey
# Andrey 14.08.2015 03:25
Добрый день, а можно ли запарсить атрибут style?

Пробовал так:


$bgPos = $digit->getAttribute('style');
echo $bgPos. '';


И так:
echo $digit->style . '';


Почему то не вышло(
0
Leroy
# Leroy 14.08.2015 11:30
и первый и второй вариант верны, ищите ошибку где-то выше
0
Владимир М
# Владимир М 24.08.2015 10:23
Есть ресурс http://rabota.e1.ru/vacancy?rubric[]=50 который при парсинге вакансий ничего не отдает, хотя http://rabota.e1.ru выдает все номально.
Код:


При обработке выдает ошибку:
Fatal error: Call to a member function find() on a non-object in C:\OpenServer\domains\localhost\index.php on line 5

Как я понимаю в следствии пустого обьекта.
Прошу помочь составить запрос.
0
kuller
# kuller 24.09.2015 21:24
Не могу чета понят. Помогите разобраться. Допустим код из примера который парсит картинки выводит их на страницу, а если надо каждой картинке спарсит еще описание, как это сделать? Что только и не пробовал сделать. Сейчас вот такой вид

foreach($data->find('h2.zagolovki') as $txt)
{
$htmls = $txt->innertext;

$a++;
if($a>$n)break;
}

foreach($data->find('div.shortimg a img') as $img)
{
$arr = explode("/", $img->src);

echo $htmls.'';

$i++;
file_put_contents('uploads/'.($arr[5]).'.jpg', file_get_contents($img->src));
if($i>$n)break;
}

результат работы, для каждой картинки берется одинаковый заголовок. Что не так?
0
Виктор Назаров
# Виктор Назаров 30.10.2015 20:02
Подскажите, а как заменить ссылку, оставив текст
например Игры онлайн как заменить http://igroflot.ru/ на http://site.ru?
К сожалению php не знаю, а в комментариях похожего случая не было.
0
Виктор Назаров
# Виктор Назаров 30.10.2015 20:28
К сожалению html не отобразилось, вот пример:
  • Игры онлайн как заменить http://igroflot.ru/ на site.ru?
0
Виктор Назаров
# Виктор Назаров 30.10.2015 20:30
a href = "igroflotru/" >Игры онлайн
0
Leroy
# Leroy 03.11.2015 14:15
http://php.net/manual/ru/function.str-replace.php
0
Vladimir
# Vladimir 22.12.2015 15:10
Помогите спарсить отсюда http://101.ru/?an=personal_playlist&userid=489993

Самое верхнее название исполнителя и трэка, вот часть из кода:

Цитата:



KEIFER, Tom - Blue Christmas
Отсюда нужно забрать "KEIFER, Tom - Blue Christmas"

Спасибо!
0
Vladimir
# Vladimir 22.12.2015 15:12
Код некорректно отобразился:




KEIFER, Tom - Blue Christmas


из этого нужно забрать "KEIFER, Tom - Blue Christmas"
0
АлександрАнатольевич
# АлександрАнатольевич 29.01.2016 23:15
Спасибо огромное! Очень помогло)
Было бы интересно увидеть настолько же подробный мануал по парсингу сайтов с защитой.
Может быть есть готовые библиотеки с эмуляцией браузера? Наподобие зеннопостера только на PHP
+1
Александрqazzzqsa
# Александрqazzzqsa 31.01.2016 21:56
Как найти элемент по тексту между тегами? Например Employment type
Пробовал
$html->find([text()='Employment type'])
$html->find('Employment type')
не получается(
0
jkeksa
# jkeksa 31.03.2016 08:08
Спасибо, но все же регулярками иногда прощще найти что-то..
Часто надо выдернуть какой-то контент из текста, хотя по ДОМу лазиить лучше конечно селекторами.
С другой стороны.. оба этих метода легко крошатся при модификациях страниц.
0
Leroy
# Leroy 01.04.2016 09:10
ну лазить по дому все же надежнее и при модификации страницы селекторы поправить проще. Можно их в конфиге парсера к примеру все держать. С регулярками так тоже можно, но так вот просто не поправишь, надо тестить, смотреть окружение. Проверить под все ли случаи подходит.
А так да, я совмещаю и регулярки и дом. Если нужно выдернуть одно единственное значение то конечно лучше регулярки
0
Евгений
# Евгений 19.07.2016 17:25
никто не подскажет в чем ошибка ? переменная $zz нече не парсит
Код: foreach($html->find('#allEntries') as $a){
$jj = $a->plaintext;
$zz = $a->find('.vnewtop')->plaintext;
0
Ivan26ru
# Ivan26ru 09.08.2016 01:03
Цитирую Евгений:
никто не подскажет в чем ошибка ? переменная $zz нече не парсит
Код: foreach($html->find('#allEntries') as $a){
$jj = $a->plaintext;
$zz = $a->find('.vnewtop')->plaintext;


find('.vnewtop') ищет все элементы с классом vnewtop, и добавляет в массив, а plaintext выводит чистый текст уже для конкретного элемента.
Решение:
$zz = $a->find('.vnewtop');
foreach($zz as $zzz){
echo "Тест zzz: " . $zzz->plaintext;
}

примерно так, но могу и ошибаться)
0
Александр8839
# Александр8839 22.08.2016 23:13
$img = $data->find('img', 0);
$img_src = $img->src;
echo $img_src->outertext;
Почему не работает? Пишет: Trying to get property of non-object in
Хочу заменить урл в src на свой, как это сделать?
0
Leroy
# Leroy 23.08.2016 07:21
$img_src это просто текст, зачем вы к нему образщаетесь $img_src->outertext
0
campusboy
# campusboy 02.09.2016 02:51
Долго - это сколько?
0
Андрей64646464646464
# Андрей64646464646464 18.09.2016 09:10
Явно автор забыл про новичков... Ну да, зачем вообще что то обьяснять, когда можно показать на сколько ты крутой и все и так понимаешь... Что, откуда и куда не понятно. Даже тратить время не буду. Задрали со своими гавносайтами! Учитесь обьяснять и разжовывать!
0
Leroy
# Leroy 20.09.2016 09:21
)))) а вы наверно денег хотите заплатить за разжевывание?)) А то как-то непонятно, автор потратил время, написал статью, а вы даже спасибо не удосужились написать.
0
campusboy
# campusboy 04.10.2016 16:22
Ну хоть время для выливания говна у тебя хватает. Жаль вот время на разбор примеров его нет.
0
Drop
# Drop 04.10.2016 16:18
Сделал такой парсер.
$link = $_POST['page'];

include('simplehtmldom/simple_html_dom.php');
$html = file_get_html('http://weplay.tv/csgo/tournaments');
$rated = array();

foreach($html->find('td') as $t1)
echo $t1->plaintext;
#print_r($rated);
$html->clear();
unset($html);
хочу спарсить таблицу. Но класс есть только у первого и последнего столбца. Как сделать так, чтобы парсились только те строки, у которых в 5 стобце класс status complete ?
0
Женя
# Женя 10.11.2016 19:24
Всем привет , поделитесь опытом как можно при помощи этой библиотеки пропарсить все страницы сайта пример или пошагово ? то есть насколько я понимаю начинаем искать ссылки на страницах и переходим по этим ссылкам но не совсем понятно как избавится от дублей и ссылок на другие сайты
0
magasin bio en ligne
# magasin bio en ligne 22.05.2017 04:52
Wow, stunning portal. Thnx ...

find out this here - click here to find out more - click through the next site - watch this video
- Recommended Web page -
sneak a peek at this
web-site.
- please
click the up coming post
- Get Source - Suggested Looking at - why not find out more - visit this weblink -
Continuing -
Read the Full Posting - click for more - Related Web Page - go to the
website
- my homepage - look at here
- click through the
up coming document
- her
latest blog
- more information - great site - Read A great deal more - just click for source - listen to
this podcast
- Suggested Webpage - click through the next document - find more information -
more
info here
- my sources -
stay with me - Get Source - just click the up coming internet page - see this here -
just
click the next web site
- navigate to this website
- browse
around these guys
- my response - relevant
web page
- simply click the next website -
My Page - similar resource site - click
through the next web page
- continue reading this - a
cool way to improve
- this website - please click the up coming document
- More Help -
sneak
a peek at this web-site.
- click here now -


http://toplegends.club/showthread.php?tid=1712 - http://forum.harryapps.com/index.php?topic=21462.0 - http://glasgoweastbusinessclub.co.uk/user/profile/510 - http://www.jdfsyj.com/comment/html/index.php?page=1&id=10689 - http://knockmeblog.com/boutique-bio-en-ligne/ - http://www.zgshihu.com/comment/html/index.php?page=1&id=60789 - http://coodm.com/comment/html/index.php?page=1&id=2206 - http://www.overcoming-cerebral-palsy.com/forum/member.php?action=profile&uid=80884 - http://metin2cocaine.ro/board/index.php?page=User&userID=30767 -
http://about.gautiergourmet.com/?option=com_k2&view=itemlist&task=user&id=113073 - http://dev-01.forum-contabilitate.ro/forum/member.php?u=1789560-RainaSwige - http://forum.konsoloyun.com/member.php?u=202-jodiebcy7 - http://www.foros.tosbase.cl/index.php?topic=58.0 - http://websitetraffic.website-marketing-ideas.info/blogs/viewstory/187070 - http://betantalized.com/ActivityFeed/MyProfile/tabid/61/UserId/35463/Default.aspx - http://feketelista.eu/index.php?topic=52981.0 - http://gta-wiki.ru/index.php?/topic/77-boutique-bio/ - http://euparrot.com/index.php?page=user&action=pub_profile&id=8710 - https://muskoka.directory/user/profile/1095 - http://sipsecurity.vn/UserProfile/tabid/61/UserID/566463/language/vi-VN/Default.aspx - http://www.green-bm.com/literature/index.php?title=Boutique_bio -
https://uklife.biz/user/profile/1013 - http://trinitynetworks.org/punbb/profile.php?id=33719 - http://forum.animals.ovh/member.php?action=profile&uid=60531 - http://brosconstructionservices.com/ActivityFeed/MyProfile/tabid/60/userId/17759/Default.aspx - http://web.enerjiuzmanlari.org.tr/UserProfile/tabid/57/userId/74646/language/en-US/Default.aspx - http://microaroma.com.cn/comment/html/index.php?page=1&id=64623 - http://freevfx.com/user/profile/8721 - http://www.lesconstructionsbenoitlarrivee.com/ActivityFeed/MyProfile/tabid/57/UserId/33/Default.aspx - http://classifiedlistingslondon.com/author/madieu48803 - http://dlhyoyo.com/comment/html/index.php?page=1&id=263173 - http://longcarp.org/?option=com_k2&view=itemlist&task=user&id=181781 - http://denizlievrak.site/author/phoebemccut/ - http://forum.genro.pw/index.php?p=/discussion/771/magasin-bio-en-ligne - http://metrologistik.com/?option=com_k2&view=itemlist&task=user&id=688138 - http://wiki.estiah.com/index.php?title=User:AntwanQ8589 - http://neccf.org/groups/boutique-bio/ - http://www.szentgyorgypince.hu/?option=com_k2&view=itemlist&task=user&id=241909 - http://www.timemerlion.com/?option=com_k2&view=itemlist&task=user&id=370877 - http://www.fostersupply.com/UserProfile/tabid/57/userId/2986535/Default.aspx -
http://misericordiaaguiardabeira.pt/?option=com_k2&view=itemlist&task=user&id=4943 - http://specialshes.co.kr/qna/3386 - http://forum.gangrad.ru/index.php?topic=7620.0 - http://bandaragenjudi.com/forum/viewtopic.php?id=680 - http://cups.cwdom.dm/profile.php?id=35964 - http://social.myyouthteam.com/profile/SamualIrvi - http://www.clasificadosdemusica.com/user/profile/703 - http://selo.info/user/profile/8441 -
http://tourviran.com/?option=com_k2&view=itemlist&task=user&id=2433 - http://www.adlot.com/singapore/classifieds/user/profile/10849

magasin bio en ligne
0
magasin bio en ligne
# magasin bio en ligne 22.05.2017 09:11
Thanks extremely helpful. Will share website with
my good friends.

relevant site -
click here for
more info
- visit my
webpage
- visit the up coming post - link -
my sources - mouse click the up coming webpage - visit the following webpage - look
here
- hop over to these guys - Read the Full Content - Suggested Online site
- his
response
- view publisher site - Suggested Website - This Web site - best site - Going to www.filmsenzalimiti.cool - learn the facts here now - go
to this web-site
- check this site out - browse around here - click here!
- index
- click through the up coming web page
- More Material - browse around these
guys
- they said - the full report -
click through the up coming post - visit their
website
- killer deal - Suggested Internet site - More Tips - this site - Going to www.filmsenzalimiti.cool - visit
my web page
- view it now - sneak a peek at this web-site. - made a post - you can try here - please
click for source
- This Web page - online
- her latest blog -
you
could look here
- please click the next page - Highly recommended
Reading
- view site… - he has a good point -

http://www.monacoarredamenti.com/?option=com_k2&view=itemlist&task=user&id=1518764 - http://uae-ads.net/user/profile/2572 - http://www.sam78.cz/modules.php?name=Your_Account&op=userinfo&username=JodyGarner - http://wiki.atlatlonline.com/index.php/User:Dexter0908 - http://www.ebajet.com/index.php?page=user&action=pub_profile&id=1099 -
http://bengaluruq.com/ghana/index.php?qa=77801&qa_1=boutique-bio - http://bbs.mobomarket.baidu.com/forum/member.php?action=profile&uid=384109 - https://forum.socialquantum.ru/member.php?u=356308-TonjaFowlk - http://www.propertyemporium.net/user/profile/69522 - http://lawlessminecraft.com/index.php?topic=5327.0 - http://panaparsian.com/bitsupport/index.php?qa=47715&qa_1=boutique-bio-en-ligne - http://diy.oacopy.com/comment/html/index.php?page=1&id=162497 -
http://www.yarturizm.ru/forum/boutique-bio-en-ligne - http://www.aerosales.co.uk/user/profile/10742 - http://www.xuanzhiang.com/comment/html/index.php?page=1&id=120090 - http://www.adlot.com/singapore/classifieds/user/profile/10849 - http://shzhyw.com/comment/html/index.php?page=1&id=106568 -
https://algarve247.com/author/lienbelstea/ - http://www.2nd-byte.com/UserProfile/tabid/61/userId/354568/Default.aspx - http://mhscb.mccmh.net/UserProfile/tabid/61/userId/567590/Default.aspx -
http://www.romavisibile.it/forum/member.php?u=32550 - http://goosehuntingchat.com/forum/viewtopic.php?f=76&t=56786 - http://darkheart-reloadet.de/board/index.php?page=User&userID=1446 - http://www.gameofwarturk.com/index.php?topic=103.0 - http://www.companyfsbo.com/author/namventura5/ -
http://mercaves.com/osclass/index.php?page=item&id=363 - http://almasi.com.ar/index.php/component/k2/itemlist/user/21785 - http://nbdb8.com/comment/html/index.php?page=1&id=16076 - http://personal.grr.host/grr/forum/member.php?action=profile&uid=3971 - http://www.msr9h.com/vb/member.php?u=1225 - http://www.pronetahost.com/comment/html/index.php?page=1&id=68982 -
https://ukrvetmarket.com/?option=com_k2&view=itemlist&task=user&id=400806 - http://www.schreinertimo.com/ActivityFeed/MyProfile/tabid/57/UserId/263989/Default.aspx -
http://moban.uniun.net/comment/html/index.php?page=1&id=13929 - http://mail.zwangserkrankungen.de/index.php?page=User&userID=408952 - http://www.skolaintellekt.ge/component/k2/author/11024 - http://www.serenomiami.com/index.php/component/k2/itemlist/user/2089264 -
http://forum.isaanco.com/member.php?u=829-TerrenceTh - http://wikiasso.fr/index.php?title=Boutique_bio -
http://mxo.hardlinedreams.com/forum/member.php?action=profile&uid=287096 -
http://artel-rm.ru/?option=com_k2&view=itemlist&task=user&id=2499 - http://www.astermatch.com/blogs/post/6306 - http://zeth.tech/index.php?topic=1448.0 - http://www.onedatefoc.us/rickiewesle - http://phuotstore.vn/UserProfile/tabid/134/userId/40622/Default.aspx - http://www.susukino.info/index.php?title=Boutique_bio - http://heidijia.com/comment/html/index.php?page=1&id=229107 - http://do.mrsu.ru/?option=com_k2&view=itemlist&task=user&id=8332 - http://inh-forum.digh.de/member.php?action=viewpro&member=JonathonV5 - http://vintageelectronics.betamaxcollectors.com/forums/member.php?u=1732-LashayBfr1

magasin bio en ligne
0
fereshthokri
# fereshthokri 22.05.2017 14:14
برای ثبت آگهی رایگان تنها کافیست روی گزینه نارنجی رنگ « + بفروشید » واقع در بالا سمت چپ تمام صفحات، کلیک نمایید. که در زیر مراحل آن ذکر شده است:
گام اول - انتخاب تصویر : برای این منظور می توانید با فشردن گزینه " افزودن عکس " در قسمت سمت راست صفحه ثبت آگهی، عکس های مورد نظرتان را ضمیمه آگهی نمایید.
گام دوم - عنوان آگهی : کادر اول با نام « چه چیزی برای فروش دارید؟ » یا همان عنوان آگهی می باشد. در این قسمت می بایست خلاصه ای از آگهی (بیشتر از 10 حرف) بنویسید. به عنوان مثال: پراید هاچ بک سفید مدل 90
گام سوم - توضیحات : در این قسمت می بایست شرح کاملی از کالا و یا خدماتی که میخواهید ثبت کنید را وارد نمایید.
گام چهارم - انتخاب گروهبندی : گروهبندی، شامل طیف وسیعی از گروه ها می باشد از لوازم الکترونیکی .گرفته تا استخدام را در برمیگیرد.پس از انتخاب گروه مورد نظر می بایست زیر گروه را نیز انتخاب نمایید
گام پنجم - قیمت : کادر چهارم انتخاب قیمت می باشد ، درج قیمت باعث افزایش بازدید و اعتماد کاربران نسبت به آگهی شما می گردد.
گام ششم - انتخاب استان و شهر : کادربعدی انتخاب استان و شهری مباشد که میخواهید در آنجا ثبت آگهی رایگان خود را بفروش برسانید پس از این مرحله کادر انتخاب محله قرار دارد .
ثبت آگهی رایگان http://balonagahi.com ثبت آگهی رایگان
با کلیک بروی بعدی وارد صفحه اطلاعات تماس میشوید که با وارد کردن شماره تماس و ایمیل خود آگهی شما ثبت میگردد.
0
Shelley
# Shelley 22.05.2017 15:17
Many thanks, this site is very handy.

try this website -
her comment
is here
- This Web-site
- why
not try these out
- Suggested Reading
- visit this
backlink
- Full Article
- look these up
- you could
try these out
- visit the next
internet site
- click over here - related web-site -
please
click the following webpage
- official
website
- just click the following webpage
- read more - here are the findings
- Recommended Browsing - click
the next website page
- sources - click here! - Recommended
Studying
- view it now - please
click www.rashalaika.ru
- please click
the next site
- click the up coming
webpage
- click through
the up coming web site
- simply click the following website page - just click
the following webpage
- helpful
resources
- they said - Home
Page
- related - original
site
- visit the next post
- the full report -
click through the following internet
site
- Read More At
this website
- browse around these
guys
- find more info - just
click the following internet site
- visit the following
webpage
- This Resource site
- click
the next internet page
- click this - Highly recommended Internet
site
- Going In this article -
click through the next internet site - these details - Click That
Link
-

http://quiltblockpartykits.com/UserProfile/tabid/61/userId/916801/Default.aspx -
http://www.syiok.com/author/chauweiner/ - http://www.ninovaccapasticceria.com/?option=com_k2&view=itemlist&task=user&id=166803 - https://some1tolove.com/blogs_post.php?id=12215 - http://manipulacaopaguemenos.com.br/?option=com_k2&view=itemlist&task=user&id=277556 - http://retroarchive.club.cc.cmu.edu/wiki/index.php/Boutique_bio -
http://dichnhac.com/forums/member.php?u=73353-BrandyCoff - http://www.kostarof.com/foro/member.php?u=246542-LucaGoldma - http://stroykartel.ru/component/k2/itemlist/user/145257 - http://jubla.org/?option=com_k2&view=itemlist&task=user&id=6902 - http://goodfolksmingle.com/index.php?dll=profile&sub=blogview&item_id=418094&item2_id=221 - http://www.junjuntex.com/comment/html/index.php?page=1&id=7166 - http://www.lamaisondechatelus.com/?option=com_k2&view=itemlist&task=user&id=5553 - http://web.iiskj.com/comment/html/index.php?page=1&id=121591 -
http://asayel.org/index.php/ar/component/k2/itemlist/user/159566 - http://postkr.com/user/profile/1051 -
http://leadingis.co.kr/?document_srl=16513 - http://www.barasti.com/story.php?id=19459 -
http://www.scmirt.org/?option=com_k2&view=itemlist&task=user&id=92746 - http://www.ibs.pe/?option=com_k2&view=itemlist&task=user&id=91451 - https://www.redworks.nl/my/wiki/index.php/Boutique_bio - http://www.xmyhsm.com/comment/html/index.php?page=1&id=29608 -
http://emisorapotencialatina.com/?option=com_k2&view=itemlist&task=user&id=9830 -
http://vb.2nbb.com/member.php?u=17438&tab=visitor_messaging -
http://sp1.allinua.com/index.php?topic=14287.0 - http://dismuvisa.com/?option=com_k2&view=itemlist&task=user&id=7018 - http://comedywiki.org/index.php?title=Boutique_bio_en_ligne - http://aestetic.su/index.php/component/k2/itemlist/user/15560 - http://gypsyjazz.com/UserProfile/tabid/57/UserID/13229/Default.aspx - http://ofertowka.info/user/profile/284 - http://www.ecobora.co.ke/?option=com_k2&view=itemlist&task=user&id=614043 - https://www.runemarket.com/member.php?action=profile&uid=69 - http://uss-solaria.com/lcars/index.php?title=User:Claudette9774 - http://www.tjproducoes.com.br/?option=com_k2&view=itemlist&task=user&id=2754 - http://www.mikaelsiebenrock.com/User-Profile/userId/340160.aspx - http://mythanhphat.com/?option=com_k2&view=itemlist&task=user&id=5389 - http://www.battle-group.com/bgwiki/doku.php?id=boutique_bio - http://www.marchofhistory.com/wiki/index.php?title=Utilisateur:MaryjoGold1 - https://exporthelp.asia/?option=com_k2&view=itemlist&task=user&id=3845 - http://smartshop.msk.ru/?option=com_k2&view=itemlist&task=user&id=1434 - http://akdeco.com/?option=com_k2&view=itemlist&task=user&id=5237 - https://www.danishterrace.dk/forum/viewtopic.php?id=249 - http://islamicfroum.com/member.php?u=2109-GabrielaWi - http://phoneche2016.com/comment/html/index.php?page=1&id=1110 -
http://devel.primarynet.co.kr/xe/?document_srl=175938 - https://monteforlife.com/author/cathern52t2/ - http://stargeek.com.br/?option=com_k2&view=itemlist&task=user&id=1751 - http://istanbulescortsgirls.com/index.php/author/kaitlyncous/ - http://thetradespot.co.ke/author/nolabarge7/ - http://www.clim.es/component/k2/itemlist/user/38376

boutique bio (Shelley)
0
massage lyon
# massage lyon 22.05.2017 19:53
La jeune mere saisit et coupa avec ses dents l'ombilic;
puis elle plongea ses doigts dans un pot d'eau, que lui presenta
Toutou-Mak, et les frotta sur les levres du marmot, en disant: Imekautet (tu as bu beaucoup).


massage lyon
0
magasin bio en ligne
# magasin bio en ligne 22.05.2017 21:49
Really wished to tell you Now i'm pleased I stumbled in your web site.



click here - breaking news - relevant web-site - visit
the next website page
- please
click the next internet page
- click through the next web
page
- mouse click the next webpage - view site… - please click for source - click the next page - More Support - Read Significantly more
- More Material - his explanation - see this here - what do you think - resources - related - click the next
post
- read
review
- simply click the up coming
web site
- you can try this out - Suggested Webpage - pop over to these guys - have a peek at these guys - just click the following internet page
- try these guys - click through the following web site - please click the next
site
- view publisher site - check this link right here now - This Internet site - simply click the following article
- Check Out notariosdelperu.com - visit this page - visit the up coming site - sneak a peek at this web-site. - investigate this site - click for info - source website - click here! - just click the following internet
site
- that guy - sources tell me - just click the up coming internet page - related - click the
up coming web site
- simply click the up coming internet site - Main Page - click for source
-

http://www.seekingbusiness.com.mx/forum/profile.php?id=44432 - http://bloomlankaholidays.com/?option=com_k2&view=itemlist&task=user&id=3002 - http://www.sgbikemart.sg/forums/entry.php?624-boutique-bio-en-ligne - http://tapatiowoodshop.com/index.php?topic=1.75 - http://baronaeun.com/?document_srl=15547 - http://ginecologoshpv.com/?option=com_k2&view=itemlist&task=user&id=45794 - http://3rdwheelfriends.com/groups/magasin-bio-en-ligne/ -
http://www.igoalforum.com/member.php?u=30687-DaneHammac - http://www.hostanartist.com/user/profile/1185 - http://anabiev.ru/component/k2/itemlist/user/4056.html - http://www.hiscare.com/userinfo.php?uid=301829 - http://dragonsbane.online/Pantheon_Xoops/userinfo.php?uid=28564 - http://hellfirekingdom.it/Forum/member.php?action=profile&uid=3040 - http://www.happyniess2010.com/comment/html/index.php?page=1&id=250880 - http://www.tuning-forum.ch/index.php?page=User&userID=40190 - http://www.zettabyte.ws/devwiki/index.php?title=User:PercyGillon06 -
http://trumptopia.info/story.php?title=boutique-bio-2 - https://commons.wikimedia.org/wiki/User:Daniele7723 - http://www.thesteelbrotherhood.com/modules.php?name=Your_Account&op=userinfo&username=MadelaineF - http://designmasters.ca/?option=com_k2&view=itemlist&task=user&id=1116 - http://xpatmarket.com/user/profile/27588 - https://wiki.whittier.domains/User:EsperanzaWinslow - http://wiki.elemons.de/index.php?title=Benutzer:IsabelleM64 -
http://b-drushim.co.il/ActivityFeed/MyProfile/tabid/61/UserId/26309/Default.aspx - http://www.malaysiafreeclassifiedads.com/user/profile/2594 -
http://lineleadertherapy.com/?option=com_k2&view=itemlist&task=user&id=851831 - http://www.best-teacher-hometuition.com/index.php/component/k2/itemlist/user/83720 - http://nbdb8.com/comment/html/index.php?page=1&id=16076 - http://dialhyderabad.co.in/author/augustinabe/ - http://test.melonpeel.com/punbb/viewtopic.php?id=14079 - http://mokhoagame.com/member.php?u=1382-AnastasiaS - http://saf.net.nz/forum/viewtopic.php?t=64857 - http://xn----8sba3aj4ajhcfcgi4j.xn--p1ai/ru/boutique-bio - http://ukimmigrationquestions.com/index.php?topic=378815.0 -
http://gadgetgirl.ru/index.php?title=Boutique_bio_en_ligne - http://takara-sagashi.com/userinfo.php?uid=2377626 -
http://carrefour-floride.com/pac/author/berndkingsm/ - http://www.nediyakadu.com/?option=com_k2&view=itemlist&task=user&id=10883 - http://www.itn-horeca.gr/?option=com_k2&view=itemlist&task=user&id=2262585 - http://teadusarvutused.hpc.ut.ee/index.php/User:TraceeRembert3 - https://khuzestan.haj.ir/Default.aspx?tabid=84&userId=2518 - http://shadipic.com/?option=com_k2&view=itemlist&task=user&id=33077 - https://herroelen.org/wiki/index.php/Gebruiker:PhillisReiniger - http://www.capebretoncountryclub.com/component/k2/itemlist/user/12580 - http://www.usps.org.ua/?option=com_k2&view=itemlist&task=user&id=5359 - http://www.kr1airsoft.altervista.org/forum/member.php?action=profile&uid=5029 - http://theswingcatsband.com/?option=com_k2&view=itemlist&task=user&id=6632 - http://alvar.cl/index.php/component/k2/itemlist/user/220723 - http://www.robino-stoffering.nl/userinfo.php?uid=13833 - http://sgongyu.com/comment/html/index.php?page=1&id=26239

magasin bio en ligne
0
boutique bio
# boutique bio 23.05.2017 01:45
Thanks meant for delivering these wonderful details.


over at this website - linked internet page - Learn Even more
Here
- read this article - related -
please click the following internet page - Read More Listed here
- please click
the next page
- Continued -
Full Posting - the full details - visit this link - additional resources - additional hints -
read more - navigate to this website - his response -
extra resources - related internet page - Read the Full Report - click the next web site -
visit the following internet site - visit this site right here - visite site - just click for source
- read on - check out this site - visit my
website
- Continued - more resources - breaking news - simply click the up coming webpage - go
- click through the up coming post - pop
over to this site
- redirected here - he
has a good point
- Additional Info -
Suggested Web page - visit
the up coming site
- visit - visit the following internet page - mouse click the next document - visit the following post - click
through the next website page
- you can check here - visit the next web
site
- click for more -
mouse click for source - please click the up coming article -

http://web.iiskj.com/comment/html/index.php?page=1&id=143992 - http://apft.edu.in/Default.aspx?tabid=61&userId=812513 - http://homelessresources.net/smf/index.php?topic=289237.0 -
http://raiztv.co.uk/community/index.php?topic=221.0 - http://www.begeleidwonenbrussel.be/UserProfile/tabid/57/UserID/53100/Default.aspx - http://weightlossnycity.com/?option=com_k2&view=itemlist&task=user&id=307787 - http://forum.agrome.be/index.php?p=/discussion/145/boutique-bio - http://www.soleermetico.com/inclusiveyouthwork/index.php?title=User:ALCMarion972845 - http://exchange.deu.ac.kr/?document_srl=11024 - http://ctroygrupp.ru/forum/member.php?u=48614-FideliaMor - http://restaurantjoblisting.net/forum/member.php?u=220-ReeceTille - http://www.ilkokuldayiz.com/member.php?action=profile&uid=972 - http://maxspot.de/vp/Upload/member.php?action=profile&uid=88665 - http://www.staarcondicionado.com.br/?option=com_k2&view=itemlist&task=user&id=72284 - http://www.kfbearing.com/comment/html/index.php?page=1&id=166948 - http://zicheng01.hk1.host03.net/comment/html/index.php?page=1&id=213082 - http://wiki.bg-editor.com/index.php/Boutique_bio_en_ligne - http://www.giahungdiecasting.com/?option=com_k2&view=itemlist&task=user&id=2946 - https://en.vedicencyclopedia.org/wiki/User:LanceShelton - http://antalyaescortmasoz.com/author/kentonlibby/ - http://partitiontak.com/?option=com_k2&view=itemlist&task=user&id=205208 - http://wiki.dynaop.com/tiki-view_forum_thread.php?comments_parentId=8291 -
http://www.namibus.ru/?option=com_k2&view=itemlist&task=user&id=199010 - http://www.home-upgrade.net/user/profile/4156 - http://laprincesadeljamon.com/component/k2/itemlist/user/12296 - http://www.condoatcost.com/viewtopic.php?id=8756 - http://www.businessguide.in/user/profile/131169 - http://forum.pencilandinkreviews.com/discussion/78527/magasin-bio-en-ligne - http://forum.gigabyte.de/index.php?page=User&userID=38500 - http://arms.land/user/profile/924 - https://multimine.net/forums/profile.php?id=199121 - http://taildraggersrc.com/MyBB/member.php?action=profile&uid=3210 - http://www.bangladeshenvironment.com/?option=com_k2&view=itemlist&task=user&id=4381 - http://wiki1337.com/User:JeannieRenard -
http://nucuoiviet.edu.vn/member.php?u=152627-MelanieRob - http://wiki1337.com/User:JeannieRenard - http://premiumtransportes.com.br/?option=com_k2&view=itemlist&task=user&id=8903 - http://annonces.antoniovinci.be/author/eunicecolun/ - http://mayuqi.net/?option=com_k2&view=itemlist&task=user&id=5028 - http://www.hellochandigarh.com/user/profile/1692 - http://www.kemilauiklan.com/user/profile/240 - http://madhurebba.net/index.php/component/k2/itemlist/user/1508850 - http://plutojobs.com/story.php?id=21151 - http://www.malaysiafreeclassifiedads.com/user/profile/2594 - http://www.rpickem.com/story.php?title=magasin-bio-en-ligne - http://www.aasobriedade.org/modules.php?name=Your_Account&op=userinfo&username=KristanKit - http://www.lolasgreenhair.com/author/bolmarilyn/ -
http://www.last-trumpet.org/using-joomla/blogger/listings/salschaaf401487.html - http://mobiledragway.com/forum/member.php?u=343885-EmmanuelWy - http://wpobierowie.eu/user/profile/391

boutique bio