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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Слова на html страницы 
:(
    Опции темы
player943
Дата 17.12.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Граждане, вот проблема, нужно просто найти число одинаковых слов на html содержимом страницы
У меня программа почему то не считает одинаковые слова находящиеся в одной строке, помогите плз.

Код

#!/usr/bin/perl

use LWP::Simple;
use LWP::UserAgent;

print "Enter URL: ";
$a = <STDIN>;
chomp($a);

getstore($a, "file2");
open (IN, "file2");
@ar = <IN>;

$j = 0;
print "Enter word: ";
$str=<STDIN>;
chomp($str);

#$str = "test";

 $length = @ar;
 for ($i=0;$i < $length;$i++)
  {
  $ar[$i]=~ s/<[^>]*>//gs;

   if($ar[$i]=~/$str/ig)
    {
      $j++;
    }
  }
print "Words: $j\n";


Это сообщение отредактировал(а) player943 - 17.12.2006, 21:11
PM MAIL WWW ICQ   Вверх
nitr
Дата 17.12.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



заюзай хеш smile

$hash{слово_которое_повторяется}++;

Добавлено @ 21:52 
но код ужасен smile, я так понял это слово вводится?


--------------------
PM   Вверх
player943
Дата 17.12.2006, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вводиться 2 параметра: страница в интернете и слово
1)например если вводить : http://www.google.ru  и слово google то находит только 2 раза, хотя их там 3
2) если попробовать: http://www.linuxjournal.com и слово embedded то все ок, 5 раз встречалось.

file2 используется для просмотра содержимого Html страницы

udp: поправил сообщение о getstore

Это сообщение отредактировал(а) player943 - 17.12.2006, 23:41
PM MAIL WWW ICQ   Вверх
nitr
Дата 17.12.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



разве? smile
читаем perldoc LWP::Simple
это сохранение содержимого по ссылке $url в файл $file
т.е.
Код

#!perl -w
use LWP::Simple;
use strict;

getstore('http://www.yandex.ru/', 'output.html');

сохранит содержимое странички по ссылке Яндекса в файл output.html

Добавлено @ 22:55 
Цитата

getstore($url, $file)

Gets a document identified by a URL and stores it in the file. The
return value is the HTTP response code. 



--------------------
PM   Вверх
player943
Дата 17.12.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



с getstore я разобрался...
а тогда в чем ошибка , почему не считает на строке,а только постолбцам? 

PM MAIL WWW ICQ   Вверх
nitr
Дата 17.12.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



молодец, тогда скажи, необходимо ли учитывать html-теги? smile
если нет, то способов очень много, один из простых, но не всегда эффективный способ:
Код

$content =~ s/<[^>]+?>//gsm;



--------------------
PM   Вверх
nitr
Дата 18.12.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



ну а можешь так попробовать... если так нужен getstore ;)
Код

#!perl -w
use LWP::Simple;
use strict;

print "Input url: ";
chomp(my $url = <STDIN>);
print "Input word: ";
chomp(my $str = <STDIN>);

getstore('$url', 'output.html');
open my $flh, '<output.html';
local $/;
my $content = <$flh>;
close $flh;
$content =~ s/<[^>]+?>//gsm;
my $count;
while ($content =~ /\b$str\b/g) {
    $count++;
}
print $count;



можно так сделать (принцип один, но имхо быстрее ;), да и кода меньше):
Код

#!perl -w
use LWP::UserAgent;
use strict;

print "Input url: ";
chomp(my $url = <STDIN>);
print "Input word: ";
chomp(my $str = <STDIN>);

my $content = LWP::UserAgent->new->get($url)->content;
$content =~ s/<[^>]+?>//gsm;
my $count;
$count++ while ($content =~ /\b$str\b/g);
print $count;



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


Новичок



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

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



Спасибо большое, я разобрался  smile 
PM MAIL WWW ICQ   Вверх
nitr
Дата 18.12.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



player943, не за что.
Надеюсь со всем разобрался? smile был бы тут amg, он бы ещё уменьшил код =)))


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


Новичок



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

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



Решил прикрутить html + cgi

http://host/cgi-bin/form2.cgi
Код

#!/usr/bin/perl
use LWP::UserAgent;
#use strict;
use CGI qw(:standart);
use CGI qw( :cgi );

print "Content-type: text/plain\r\n\r\n";
#print "Input url: ";
#chomp(my $url = <STDIN>);
#print "Input word: ";
#chomp(my $str = <STDIN>);
$http = param('url');
$word = param('str');
my $content = LWP::UserAgent->new->get($http)->content;
$content =~ s/<[^>]+?>//gsm;
my $count;
$count++ while ($content =~ /\b$word\b/g);
print $count;


http://host/form2.html
Код

<FORM action="http://host/cgi-bin/form2.cgi" method="get">
url: <INPUT TYPE="text" name="url">
<BR>
word: <INPUT TYPE="text" name="str">
<BR>
<INPUT type="submit" value="ok"><INPUT type="reset">
</FORM>


и и и ничего не выводит  smile 
если в form2.cgi изменить print $count; на print $word; то показывает искомое слово (если print $content; то показывает подержимое html странцы на искомой странице)

Добавлено @ 21:37 
Все и с этим разобрался  smile 

form2.cgi
Код

#!/usr/bin/perl
use LWP::UserAgent;
use CGI qw(:standart);
use CGI qw( :cgi );

print "Content-type: text/plain\r\n\r\n";
$http = param('url');
$word = param('str');
my $content = LWP::UserAgent->new->get($http)->content;
$content =~ s/<[^>]+?>//gsm;
my $count;
while ($content =~ /\b$word\b/g) {
    $count++;
    }
print "Number of words: $count";



PM MAIL WWW ICQ   Вверх
nitr
Дата 18.12.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



player943, интересная задачка =))
Лаба что-ли? Или типа поисковика, статистика? smile


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


Новичок



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

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



Да обычная лаба.
Просто я мог бы скачать готовые скрипты с инету, но самому интереснее написать ctrl + f
PM MAIL WWW ICQ   Вверх
player943
Дата 26.12.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Появилась еще проблема: надо расчитать кол-во однаковых слов на странице.
То есть не задавая слово как параметр в предыдущей программе...
PM MAIL WWW ICQ   Вверх
korob2001
Дата 26.12.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Что-то в этом роде?
Код

#!/usr/bin/perl
use LWP::UserAgent;
use CGI qw(:standart);     # Это лишнее, один параметр лучше получить вручную
print "Content-type: text/plain\n\n";
$http = param('url');
my $content = LWP::UserAgent->new->get($http)->content;
$content =~ s/<[^>]+?>/ /gsm;

my %res = ();
$content =~ s/\b(.*?)\b/++$res{lc($1)}/eg;

print ucfirst($_) . " => $res{$_}\n" for sort keys %res;

Только я его не тестировал, так что возможно где-то ошибся.

Это сообщение отредактировал(а) korob2001 - 26.12.2006, 17:07


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
player943
Дата 28.12.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Программа рабочая, но я никак не пойму как мне сделать так чтобы выводились только кол-во слов, без учета знаков припинания "_ , . пробела и тд" 
PM MAIL WWW ICQ   Вверх
korob2001
Дата 28.12.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Для начала, нужно выяснить, что есть слово, в твоём понимании? После можно менять этот шаблон:
Код

$content =~ s/\b(.*?)\b/++$res{lc($1)}/eg;

Например мы подразумеваем под словом, последовательность символов латинского алфавита.

Допустим у нас есть строка:
Код

This is a simple ------- test.

Нам необходимо найти такие слова как "This",  "is", "a", "simple", "test".  Изменим шаблон на такой:
Код

$content =~ s/\b([A-Za-z]+)\b/++$res{lc($1)}/eg;

В итоге мы будем считать все последовательности символов из латинского алфавита. Если же слова состоящие из одного символа нам не нужны, то их можно тоже отсеять немного изменив предидущий шаблон.
Код

$content =~ s/\b([A-Za-z]{2,})\b/++$res{lc($1)}/eg;

Теперь символ "a" не будет принят за слово.

Вобщем сначала нужно знать, что есть слово, в твоём случае.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Zuzu
Дата 29.12.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(korob2001 @  28.12.2006,  13:32 Найти цитируемый пост)
Для начала, нужно выяснить, что есть слово, в твоём понимании?


Я применял другой подход. Выяснил для себя, что "точно есть не слово", затем эти "не слова" заменил на "мой разделитель" и разобрал строку спомощью split.

Что-то типа:

Код

...
my $delimiters = ',.;!?';
$line =~ s/$delimiters/ /g;
...


Получилось в несколько проходов, зато, ИМХО, более наглядно.

--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
korob2001
Дата 29.12.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Вероятность что-то пропустить (не учесть) гораздо больше, когда ты исключаешь то, что не нужно. Легче выделить именно то, что нужно. Хотя основное приимущество такого подхода состоит в том, что вероятность допустить ошибку снижается до нуля. Об этом помоему, можно почитать в книге "Разработка CGI приложений на Perl", где автор очень хорошо это объясняет. Правда там речь шла об очистке данных, полученных из сети.

ЗЫ: Я точно не помню, в какой именно книге об этом написано, потому написал ПОМОЕМУ. Но если интересно, то могу уточнить это.


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


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

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


 




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


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

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