Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> качаем страницу 
:(
    Опции темы
Axe79
Дата 21.7.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



Нужен совет.
Задача обычная скачать страничку (просто текст)
Код

#!/usr/bin/perl

use LWP::UserAgent;
my $path="http://www.vashmagazin.ua/cat/catalog/?rub=128&subrub=1";
my $browser = LWP::UserAgent->new();
my $response = $browser->get($path,
    'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
    'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3',
);
$www=$response->content;
use Encode qw(encode decode);
$contents = Encode::encode('utf8', Encode::decode('Windows1251', $www));

open(F, ">/home/axe/Desktop/ddd")||die "$!";
print  $contents;
print F $contents;
close(F);


И во когда победа вроде бы близка и стоит открыть файл и пропустить через фильтры 
... В файле привет от китайского посла.
Кодировки... Какая у меня? в какую конвертировать...? В общем в данном случае бесплодие методом тыка не лечится((( Вот.

Сижу под линухами Alt.
P.S. при чём что интересно в консоли всё ок а файл в иероглифах.
И вообще может есть толее цивилизованый метод получить чистый текст...
Заранее спасибо.

Это сообщение отредактировал(а) Axe79 - 21.7.2009, 01:16
PM MAIL   Вверх
Itsys
Дата 21.7.2009, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



А ты уверен, что исходная страница в "Windows1251", ты б сначала использовал find_encoding....
PM MAIL WWW Skype   Вверх
Axe79
Дата 21.7.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



не уверен...

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

Просто в перловском ООП я новичок и немного путаюсь с синтаксисом(((

Добавлено @ 09:06
Вроде как  на CPAN-е

Encode::Alias ?

[$obj =] find_encoding(ENCODING)

$obj---это опредиляемый текст?
ENCODING--- это кодировка...?

в общем в таком формате не работает
Код

$My_Text = find_encoding($contents);
print  $contents;




Это сообщение отредактировал(а) Axe79 - 21.7.2009, 09:07
PM MAIL   Вверх
Pfailed
Дата 21.7.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Axe79, код у вас в первом посте вполне рабочий. Это подтверждает то, что при выводе на консоль текст читаем. Проблема у вас с текстовым редактором, где вы затем пытаетесь открыть сохраненный файл. Этот редактор либо не поддерживает utf8, либо по умолчанию открывает текст в неверной кодировке. Что это за редактор?


--------------------
PM MAIL   Вверх
Axe79
Дата 21.7.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



автоматически открывает в Konqeror
Закидываю в мозиллу тоже самое
Опен офис Аналогично

только если в простом kwrite то никаких проблем с кодировкой

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

боюсь что я не туда забрёл...

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

Простите за сумбурность

Добавлено через 7 минут и 59 секунд
но на будущее универсальный определитель исходной кодировки не помешал бы... smile  smile  
PM MAIL   Вверх
Pfailed
Дата 21.7.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Ну ясное дело что в браузере страница открывается в неверной кодировке, потому как в коде страницы не указан charset. Вам нужно удалить все теги и оставить только текст? Посмотрите в сторону модуля HTML::FormatText. Если вам нужно извлечь какой-то конкретный текст страницы можно будет обойтись и простым регулярным выражением.


--------------------
PM MAIL   Вверх
Axe79
Дата 21.7.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



а есть какая-то основоположная разница между использованием регулярных выражений для очистки от гипертекстовой разметки?

и использованием модуля HTML::FormatText

 я например почти полностью обошёлся такими шаблонами:
Код


if(/[а-я]/){
s/>|<|[A-z];|"|=|&|[A-z]//g;
s/тел.\/:/тел.:/g;
s/(\d{2,5})\//$1/g;
s/^$|^\n$//g;
$,="\n";
print ;}


может я и не прав ... Посоветуйте.

Добавлено через 2 минуты и 27 секунд
просто в шаблонах немного разбираюсь а с HTML::FormatText нет.
да и внятных примеров чего-то не нашёл.
PM MAIL   Вверх
burakov
Дата 22.7.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день,
работаю под Windows...

так что немного у меня не так как у Вас, 
код который дал Axe79 действительно что то делает, но Encode как то не так срабатывает....
Я его переписал на свой манер (именно там где используется Encode) и у меня под windows все нормально заработало.....
может мой код поможет?

Код

use strict; 
use warnings;
use LWP::UserAgent;

my $path="http://www.rambler.ru/index.html";
my $browser = LWP::UserAgent->new();
my $response = $browser->get($path,
    'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
    'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3',
);
my $www = $response->content;

use Encode qw(encode decode);
my $contents = encode ('cp1251', decode ('utf8', $www));
open (FILE, ">1.txt") or die; 
print FILE $contents;
close (FILE); 



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
yorm
Дата 22.7.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 1.10.2006

Репутация: нет
Всего: нет



Цитата

.. В файле привет от китайского посла.


похоже, что кодировка правильная (utf8) но без флага. Распространенная проблема. Попробуй включить _utf8_on() - в строку добавится флаг.

Если правильно понял, проблема узнать, в какой кодировке действительно отсылается страница? Я смотрю Firefox -> View -> Character Encoding, обычно так показывает правильно.
А вообще, для конвертации можно использовать Text::Iconv, конвертирует на ура (но проблему с флагом не решает)
PM MAIL   Вверх
Axe79
Дата 28.7.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



Ещё один нюанс.
Язык украинский и почему то вместо некоторых букв идут непечатаемые символы.

используется такая кодировка

Код

$contents = encode('utf8', decode('cp1251', $response->content));


вот результаты:

рстві� із
ПопитБIЗНЕС-� ЕКЛАМАГ

короче  "Р" глючит и "Э"
PM MAIL   Вверх
Pfailed
Дата 28.7.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(Axe79 @  28.7.2009,  18:09 Найти цитируемый пост)
Ещё один нюанс.

Ссылку на страничку с этими символами будьте добры.


--------------------
PM MAIL   Вверх
Axe79
Дата 28.7.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2009

Репутация: нет
Всего: нет



PM MAIL   Вверх
Pfailed
Дата 28.7.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(Axe79 @  28.7.2009,  18:30 Найти цитируемый пост)
http://vashmagazin.ua/cat/catalog/?rub=128...ce2=&page=1

Что то я не обнаружил тут ни символа "Р", ни символа "Э".
Тут есть "Р", но он как и положено после сохранения отображается символом "Р". Проверено на следующем однострочнике:
Код

perl -MEncode -MLWP::UserAgent -e 'print decode("cp1251", LWP::UserAgent->new->get("http://www.vashmagazin.ua/cat/catalog/?rub=106&subrub=4")->content)' > dump.html



--------------------
PM MAIL   Вверх
mrrico
Дата 28.7.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.7.2009

Репутация: нет
Всего: нет



Имхо,
utf не совсем обычный текст. Можно довольно часто дать print на utf текст и скрипт обломится. wide character.

Думаю, решение было в том, чтобы дать на текстовый файлхэндл вот такую штуку:

Код

open(F, ">/home/axe/Desktop/ddd")||die "$!";
 binmode F;
print  $contents;
print F $contents;
close(F);


Тогда бы и utf в файл нормально записался.
PM MAIL   Вверх
chorny
Дата 29.7.2009, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 27.7.2009
Где: Молдавия

Репутация: нет
Всего: нет



Кстати сайт правильно пишет в заголовках: "Content-Type: text/html; charset=windows-1251"

Вот так у меня правильно отображается страница в Firefox
Код

#!/usr/bin/perl

use strict;use warnings;
use LWP::UserAgent;
my $path="http://vashmagazin.ua/cat/catalog/?rub=128&subrub=1&item_price1=&item_price2=&page=1";
my $browser = LWP::UserAgent->new();
my $response = $browser->get($path,
    'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8',
    'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
    'Accept-Language' => 'ru,en-us;q=0.7,en;q=0.3',
);
my $www=$response->content;
use Encode qw(encode decode);
my $contents = Encode::encode('utf8', Encode::decode('Windows1251', $www));
$contents=~s#<head>#<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />#i;
open(my $f, ">","ddd.html")||die "$!";
print $f $contents;
close($f);


PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1207 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.