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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг html. Посчитать количество вхождений 
:(
    Опции темы
ochkasty
Дата 16.2.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно посчитать сколько раз в html-файле встречается эта комбинация:

((^\<tr\sclass\=ltr\>$^\<td\>)|(^\<tr\>$^\<td\>)|(^\<tr\>$^\<td\sclass\=port\>))B\#

(Данный набор использовал в плагине "Search and Replace" для FAR manager, поэтому сильно не пинайте, если где-то ошибся).

Умею только читать файл целиком: 

Код

open (F, 'xcn_156.htm'); 
while(read(F, $tmp, 1)!=0){; 
$str.=$tmp; 



После этого, в переменной $str получаю полное содержимое файла xcn_156.htm. Что с ним потом делать?

Спасибо.

Это сообщение отредактировал(а) ochkasty - 16.2.2011, 15:08
PM MAIL   Вверх
Grost
Дата 16.2.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А почему бы сразу во время считывания данных не поставить счётчик с условием?
PS. хотя может не совсем понял, что требуетсяsmile
PM MAIL ICQ   Вверх
arto
Дата 16.2.2011, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



$cnt = () = $str =~ m#\Q((^\<tr\sclass\=ltr\>$^\<td\>)|(^\<tr\>$^\<td\>)|(^\<tr\>$^\<td\sclass\=port\>))B\\\#\E#g

Это сообщение отредактировал(а) arto - 16.2.2011, 17:27
PM MAIL ICQ   Вверх
ochkasty
Дата 17.2.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Grost @ 16.2.2011,  16:47)
А почему бы сразу во время считывания данных не поставить счётчик с условием?
PS. хотя может не совсем понял, что требуетсяsmile

Да, можно сразу во время считывания. Как? Подскажи, пожалуйста.
PM MAIL   Вверх
Grost
Дата 17.2.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно так, если считывать построчно:
Код

while(<F>)
{if(m#\Q((^\<tr\sclass\=ltr\>$^\<td\>)|(^\<tr\>$^\<td\>)|(^\<tr\>$^\<td\sclass\=port\>))B\\\#\E){$i++;}
}


либо сначала разбить на строки потом обрабатывать:
Код

@str=split('\n', $str);
while(<@str>)
{if(m#\Q((^\<tr\sclass\=ltr\>$^\<td\>)|(^\<tr\>$^\<td\>)|(^\<tr\>$^\<td\sclass\=port\>))B\\\#\E){$i++;}
}

Только я регулярку может не правильно переписал smile
А вообще у arto, вариант лучше будет. 


Это сообщение отредактировал(а) Grost - 17.2.2011, 10:47
PM MAIL ICQ   Вверх
ochkasty
Дата 17.2.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(arto @ 16.2.2011,  17:26)
$cnt = () = $str =~ m#\Q((^\<tr\sclass\=ltr\>$^\<td\>)|(^\<tr\>$^\<td\>)|(^\<tr\>$^\<td\sclass\=port\>))B\\\#\E#g

Да, этот вариант вполне удобен. Спасибо. 

Однако, здесь, почему-то, не ищется символ начала строки:

$cnt = () = $str =~ m/^\<tr/g; -- говорит, что таких вхождений нет. Хотя точно есть. Я смотрел по F4.

Почему?
PM MAIL   Вверх
alezzz
Дата 17.2.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



$cnt = () = $str =~ m/^\<tr/gm
PM MAIL   Вверх
arto
Дата 17.2.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



потому как \Q

либо напишите правильный regexp, либо расскажите руками, что вам надо найти.
PM MAIL ICQ   Вверх
ochkasty
Дата 17.2.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(arto @ 17.2.2011,  15:53)
потому как \Q

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

Мне нужно посчитать количество таких вхождений:

- первая строка: пустая
- вторая строка полностью: <tr class=ltr> или <tr>
- третья строка начинается с: <td>B# или <td class=port>B#

Код

[пустая строка]
<tr>
<td>B#4&nbsp;</td>

или
Код

[пустая строка]
<tr class=ltr>
<td>B#3&nbsp;</td>

или
Код

[пустая строка]
<tr>
<td class=port>B#3&nbsp;</td>


Пошел от простого к сложному: 

$cnt = () = $str =~ m/^\<tr\sclass\=ltr\>$/gm; -- такую строку нахожу

$cnt = () = $str =~ m/^\<tr\sclass\=ltr\>$^\<td\>/gm; -- а такую уже нет.

Как обозначить перенос строки в регекспе?

PM MAIL   Вверх
alezzz
Дата 17.2.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



$^ -- это переменная в перл.

$cnt = () = $str =~ m/^<tr class=ltr>\n^<td>/gm;
PM MAIL   Вверх
arto
Дата 17.2.2011, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

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



perl -0777 -lne 'my $cnt = () = m/\n(?:<tr>|<tr\s+class=ltr>)\n(?:<td>|<td\s+class=port>)B#/gs; print $cnt'  file
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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