-
Posts
142 -
Joined
-
Last visited
Information
-
Sex
Мужчина
slo_nik's Achievements
Explorer (1/14)
1
Reputation
-
Добрый день. Возникла необходимость написать парсер сайтов, универсальный. Задача в следующем. Пользователь вводит адрес сайта в поле формы, через cURL получают содержимое сайта, выделить из выдачи только текст(из div, p, table, span и т.д.). Но вот вопрос. Каждый сайт, это индивидуальная структура. Как в этом случае, настроив парсер только раз, получать данные с любого сайта, не меняя настройки парсера под каждый сайт? Возможно ли это? Сейчас использую php, cUrl, htmlpurifier для получения текста с сайта. Попытался решить таким образом: <?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $address); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'); $dirty_html = curl_exec($ch); $response = (object)curl_getinfo($ch); if(stripos($response->content_type, 'windows-1251')){; $dirty_html = mb_convert_encoding($dirty_html, 'utf-8', 'cp1251'); } curl_close($ch); $prf = new HTMLPurifier(); $clean_html = $prf->process($dirty_html,[ 'AutoFormat.AutoParagraph' => true, 'AutoFormat.RemoveEmpty' => true, 'AutoFormat.RemoveEmpty.RemoveNbsp' => true, 'HTML.AllowedElements' => ['p','a','br','table','tbody','tr','th','td','h1','span','big'], 'HTML.ForbiddenAttributes' => [ 'a@href', 'a@style', 'a@rel', 'a@class', 'a@title', 'p@class', 'p@style', 'table@style', 'table@border', 'table@width', 'td@class', 'th@class', 'td@valign', 'td@style', 'td@width', 'td@colspan', 'td@align', 'td@rowspan', 'span@class' ] ]); $search = ['<p>','</p>','&','<a>','</a>','<table>','<tbody>','</tbody>','</table>','<tr>','</tr>','<th>','</th>','<td>','</td>','<h1>','</h1>','<span>','</span>','<big>','</big>']; $replace = ['',"\r\n",'','',"\r\n",'','','','','',"\r\n",'',' ','','','',"\r\n",'',' ','',' ']; $clean_html = preg_replace("#(?:<p>\s+</p>)#", '', $clean_html); $clean_html = str_replace(["\r","\n","\r\n","\t",' '], '', $clean_html); $clean_html = str_replace($search, $replace, $clean_html); $clean_html = preg_replace("#(?:\r\n?|\n){2,}#", "\r\n", $clean_html); $clean_html = str_replace(['<br>', '<br />'], " ", $clean_html); $clean_html = preg_replace("#(?:\"\'\+;)+#", '', $clean_html); echo $clean_html; ?> Или я слишком намудрил? Некоторые сайты парсит нормально, на некоторых сливаются некоторые слова/фразы, на некоторых вообще часть сайта не парсится. Результат надо записать в отдельный текстовый файл и в бд. Можно ли найти "золотую середину" которая будет нормально работать с любым сайтом, не меняя настроек скрипта? Единственная настройка, которая должна меняться это адрес сайта.
-
Вызвать функцию после завершения работы другой функции.
slo_nik replied to slo_nik's question in JavaScript
Благодарю. Мне надо чтобы не считалось, если вводятся латинские символы. Сам я придумал такое решение, может не так красиво как у Вас, но... https://jsfiddle.net/slo_nik/xx7dfax0/8/ -
Доброй ночи. Есть текстовая область в которой надо подсчитать символы. Но подсчёт нужно начинать тогда, когда не вводится адрес сайта. Например, если пользователь вводит http://site.com/index/post, то подсчёт не должен вестись, но если после адреса есть хотя бы один пробел и текст, то начинать считать символы с учётом введённого адреса. Я попытался решить задачу таким образом https://jsfiddle.net/slo_nik/xx7dfax0/5/ Но есть одна проблема. Если пользователь решил удалить/стереть текст и начал вводить заново адрес сайта, то функция сразу же начинает считать с первого символа. Если обновить страницу, то функция опять работает как надо, то есть не ведёт подсчёт символов, если вводится адрес сайта. Подскажите, пожалуйста, как решить данную проблему?
-
Добрый вечер. Прошло достаточно времени, но чтобы не создавать новую тему продолжу здесь. Поискал немного информации, посмотрел другие сайты, почитал документацию. Дело немного сдвинулось. Получилось сделать для fb и vk шаринг разных изображений с одной страницы, через get параметр передаю путь к изображению, url к изображению формируется динамически, в зависимости от того, какая картинка выбрана. // для fb <a target="_blank" title="Опубликовать в Facebook" id="fb" href="https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(murl) + '&picture=' + url + '"></a> // для vk '<a target="_blank" title="Опубликовать в ВК" id="vk" href="http://vk.com/share.php?url=' + encodeURIComponent(murl) + '&image=' + url + '"></a> вот рабочий пример Но надо сделать для twitter и для google+. Для этих сетей не получается подставить динамическое изображение. Нашёл пример в сети, на этом сайте как раз то, что мне нужно. С одной и той же страницы можно расшарить разные изображения для twitter и google+. Самостоятельно я не смог разобраться, как там всё работает. Если кто-то может помочь, пожалуйста, подскажите, как это работает? Заранее благодарю.
-
Получается, что в заголовках может и не быть информации об изменении файла?
-
Добрый день. Нужно определить дату последней модификации файла на удалённом сервере. Если использовать cUrl, то есть константа CURLINFO_FILETIME, но насколько это будет эффективно если страница сайта динамическая, данные берутся из БД? Смысл в том, чтобы не привязываясь к данным на странице просто определить, изменялась страница за последнее время или нет.
-
Изображений много, тег один, это понятно... А если при помощи js менять значение meta тега, чтобы разные люди, каждый кликнув по своей, выбранной картинке, расшаривали именно её? Не только для разных сетей, а и для одной и той же, но разные картинки, дать возможность расшарить несколько изображений одним и тем же посетителем сайта для выбранной соц. сети. Вот это главное, что надо сделать. Возможно ли такое реализовать или нет? Или только одно изображение с сайта?
-
Получается, что нет возможности при помощи кнопки "поделиться" для какой-либо сети шарить разные изображения? P.S. Ваша ссылка не помогла((( Требует авторизации, а не зарегистрирован в facebook)))
-
Добрый вечер. На сайте требуется разместить блок социальных кнопок, самые популярные сети(facebook, google+, twitter, pinterest). Перепробовал несколько готовых решений, от "Яндекс"(https://tech.yandex.ru/share/), "Pluso"(https://share.pluso.ru/) и парочки готовых плагинов для framework yii. Но меня не устроила работа данных решений. Нет возможности менять изображение, которое крепится к посту в соц. сети. Прочитал в нете, что соц. сеть кэширует изображение и данные о сайте и нет возможности изменить эту информацию. Можно изменить только в том случае, если разные страницы(разные адреса) одного и того же сайта расшариваются в соц. сети. Мне надо установить share кнопки на одной странице, где расположен слайдер с изображениями и сделать возможным расшаривать отдельно взятое изображение. В конкретном случае, для "Pluso" сделал: 1) Прописал meta теги. 2) Разместил js код на странице Выглядит это так: HTML <meta property="og:title" content="Название сайта" /> <meta property="og:description" content="Описание, лучший художник на свете!!!" /> <meta property="og:url" content="http://address_site/photoyii" /> <meta property="og:image" content="http://address_site/photoyii/image/download/75" /> <meta name="title" content="Название сайта" /> <meta name="description" content="Описание, лучший художник на свете!!!" /> <link rel="image_src" href="http://address_site/photoyii/image/download/75" />JS <script type="text/javascript">(function() { if (window.pluso)if (typeof window.pluso.start == "function") return; if (window.ifpluso==undefined) { window.ifpluso = 1; var d = document, s = d.createElement('script'), g = 'getElementsByTagName'; s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true; s.src = ('https:' == window.location.protocol ? 'https' : 'http') + '://share.pluso.ru/pluso-like.js'; var h=d[g]('body')[0]; h.appendChild(s); }})();</script><div class="pluso" data-background="#ebebeb" data-options="medium,round,line,horizontal,nocounter,theme=04" data-services="facebook,pinterest,google,twitter"></div>В независимости от того, руками или при помощи jquery, менял значение атрибутов для <meta property="og:image"> и <link rel="image_src">, изображение оставалось одним и тем же. Как можно обойти эту проблему? Что бы находясь на одной и той же странице можно было "делиться" изображением в соц. сетях.
-
Попробуйте посмотреть здесь , живой пример... Я понимаю, что проблема связана с привязкой fotorama + stackblur, для этого сделал setInterval(), не хотел скрипт без этого работать. Сейчас работает всё, fotorama + stackblur, но ошибка раздражает, хотелось бы её убрать...
-
Так в том-то и дело, что тестил я в firefox и на localhost(Apache/2.4.7). Имена файлов хранятся в БД, сначала формируется строка с изображениями для слайдера, потом применяется stackblur. Формирую строку: $allImg = ''; foreach($images as $val) : if($val->itemId != 0) : $allImg .= "{img : '" . Url::to(['/images/default/download/', 'id' => $val->id]) . "', caption: '" . $val->title . ", " . $val->description . ", " . $val->year . " год.'},"; endif; endforeach;$script = <<<JS var fotoDiv = $('.fotorama').fotorama({ width: '100%', height: '75%', data: [ $allImg ] })JS;Скрипт stackblur расположен в самом низу документа. Наверное проблема в том, что скрипт stacklur расположен перед(!) скриптом fotorama... Поменяю местами и проверю работу, может ошибка уйдёт. Сразу не обратил на это внимание. P.S Проверил, проблема осталась(((
-
Добрый вечер. Помогите решить проблему. Есть слайдер с картинками, фоном блока, где размещён слайдер, является текущая картинка. При загрузке страницы выводится ошибка: TypeError: Argument 1 of CanvasRenderingContext2D.drawImage could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageBitmap.ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height);Изначально код был таким: <div id="wrap"> <img src="2.jpg" alt="" id="img"> </div> <div id="canvasInner"> <canvas id="canvas"></canvas> </div> <script> var canvas = document.getElementById('canvas') var ccimg = canvas.getContext('2d') var img = document.getElementById('img') img.onload = function(){ ccimg.drawImage(img, 0, 0, canvas.width, canvas.height) StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 10) } </script>Я его немного переделал. setInterval(function(){ $('.fotorama__stage__shaft') .find('.fotorama__active:first') .find('.fotorama__img') .attr('id', 'imgCanvas') /* добавляем первому изображению атрибут id */ var canvas = $('#canvas').get(0) var ccimg = canvas.getContext('2d') var Img = $('#imgCanvas').get(0) ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height); StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8); }, 150)Вот этот участок кода: var Img = $('#imgCanvas').get(0)ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height);StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8);сделал так: var Img = $('#imgCanvas').get(0)Img.onload = function(){ ccimg.drawImage(Img, 0, 0, canvas.width, canvas.height); StackBlur.canvasRGB(canvas, 0, 0, canvas.width, canvas.height, 8);}и получил ошибку в firebug "TypeError: Img is undefined", a без "Img.onload = ...." получаю ошибку, которую указал выше "TypeError: Argument 1 of CanvasRenderingContext2D". Подскажите, пожалуйста, как избавиться от ошибки?
-
Не сомневаюсь, чем больше строк кода, тем больше понимаешь)))
-
Ну в данном случае это для наглядности. $ перед именем переменной символизирует, что в ней хранится объект jQuery. А в другой переменной, которая без доллара и с которой, в итоге, и нужно работать — объект АПИ, полученный из объекта jQuery Вот постоянно в этом путаюсь))) Благодарю за ответ, буду вникать в написанное Вами.
-
Нет, этой строки вообще не должно было быть. Вы тут второй раз пытаетесь инициализировать фотораму, а нужно было сначала инициализировать её один раз, потом из уже инициализированной фоторамы получить объект АПИ через .data, и вот с ним уже манипуляции производить. http://fotorama.io/customize/api/— в самом начале статьи пример кода, с помощью которого можно получить доступ к АПИ. Тогда мне не понятна разница между var fotorama = fotoramaDiv.data('fotorama') - var $fotorama = fotoramaDiv.data('fotorama') и var fotoramaDiv = $('.bill').fotorama() - var $fotoramaDiv = $('.bill').fotorama() Что именно даёт "$" перед fotoranaDiv? Работает с ним и без него...