Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Снять значение всех <td title из html (akam)
Author Message
akam
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Feb 05, 2007 5:11 pm (написано за 2 минуты 9 секунд)
   Post subject: Снять значение всех <td title из html
Reply with quote

Здравствуйте,
не пойму никак как можно снять значение всех title="(...)" из переменной с html кодом?
максимум до чего дошел это
Code (perl): скопировать код в буфер обмена
if($res=~ m (www.perldoc.com/perl5.6/pod/func/m.html)/title=\"(.+)\">/g) { print $1; }
но это не работает :(
извините за такой вопрос, я еще только учусь :(
Back to top
Михаил Романов
Участник форума



Joined: 07 Nov 2003
Posts: 46
Карма: 1
   поощрить/наказать

Location: Moscow

PostPosted: Mon Feb 05, 2007 6:50 pm (спустя 1 час 39 минут; написано за 11 минут 21 секунду)
   Post subject: Я обычно делаю так: ...
Reply with quote

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

Берем файл, считываем его построчно в массив.
Code (perl): скопировать код в буфер обмена
@content = open (www.perldoc.com/perl5.6/pod/func/open.html) (MY_FILE, "my_site/my_path/my_file.htm") || Error('open', "my_site/my_path/my_file.htm");
my @content = <MY_FILE>;
close (www.perldoc.com/perl5.6/pod/func/close.html) (MY_FILE);
Для каждого элемента массива (строка) заменяем таг <table title="" на <table. Угловую скобку не закрываю, т. к. далее могут следовать дргуие таги - style, например. Внутри кавычек после title может идти все что угодно, кроме символа кавычки, поэтому пишем (^\")* (любое число любых символов за исключением кавычки). Да, кстати, если между тагами table и title есть еще что-то, выражение не сработает, надо придумывать другое.
Code (perl): скопировать код в буфер обмена
foreach @content {
        $_=~ s (www.perldoc.com/perl5.6/pod/func/s.html)/<table title=\"(^\")*\"/<table/g;
}
Затем можно вывести массив на страницу print-ом, или записать обратно в файл
Code (perl): скопировать код в буфер обмена
open (www.perldoc.com/perl5.6/pod/func/open.html) (My_FILE, ">my_site/my_path/my_file.htm") || Error('open', "my_site/my_path/my_file.htm");
        foreach (@content) {
                print (www.perldoc.com/perl5.6/pod/func/print.html) MY_FILE "$_";
        }
close (www.perldoc.com/perl5.6/pod/func/close.html) (MY_FILE);


Last edited by Михаил Романов on Mon Feb 05, 2007 7:01 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
akam
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 06, 2007 2:31 am (спустя 7 часов 40 минут; написано за 6 минут 55 секунд)
   Post subject:
Reply with quote

спасибо за ответ, но боюсь меня не правильно понял...

есть переменная $aa. в ней содержиться такой хтмл код. допустим:
Code (html): скопировать код в буфер обмена
<td (december.com/html/4/element/td.html) title="i20-56"> (december.com/html/4/element/.html)<a (december.com/html/4/element/a.html) href="/link"> (december.com/html/4/element/.html)что еще...<td (december.com/html/4/element/td.html) title
="текст"> (december.com/html/4/element/.html)
<a (december.com/html/4/element/a.html)
href="/link2"> (december.com/html/4/element/.html)
.... и дальше в том же духе
и мне нужно узнать все значения title и href.
попробовал так
Code (perl): скопировать код в буфер обмена
while($aaa =~ m (www.perldoc.com/perl5.6/pod/func/m.html)/title=\"(.+?)\".+?href=\".+?/gsc) {
    print "
$1 - $2\n";
}
а он мне выдал первое значение title и последнее href...
и зациклился... :(
i20-56 - /link100
i20-56 - /link100
i20-56 - /link100
...

что я неправильно делаю?
Back to top
Михаил Романов
Участник форума



Joined: 07 Nov 2003
Posts: 46
Карма: 1
   поощрить/наказать

Location: Moscow

PostPosted: Tue Feb 06, 2007 11:34 am (спустя 9 часов 3 минуты; написано за 13 минут 52 секунды)
   Post subject: Это называется "жадность" регулярных выражений
Reply with quote

Теперь понял. Из первого сообщения я подумал, что снять - значит вырезать и выкинуть, а не считать.
То о чем вы пишете называется "жадность" регулярных выражений, котрые ищут самую длинную строку, удовлетворяющую шаблону.
Code (perl): скопировать код в буфер обмена
"(.+?)\"
ищет любое число любых символов, заключенных в кавычки. Из-за жадности вашего .+? он включает туда все что между первым title последней a href, включая все промежуточные кавычки и таги. Вам надо ограничить жадность, указав, что внутри не должно быть символов кавычки, то есть указать в шаблоне "любое число символов - не кавычек".

2. Для использования переменных $1, $2... в шаблоне должны быть соответствующие пары круглых скобок.

Попробуйте так:
Code (perl): скопировать код в буфер обмена
while($aaa =~ m (www.perldoc.com/perl5.6/pod/func/m.html)/title=\"(^\"*)\"[^>]*><a href=\"(^\"*)\"/gsc) {
    print "
$1 - $2\n";
}
Сразу скажу: код я не тестировал, но причину вашей ошибки думаю, что распознал верно. Комментарий к данному примеру: в первой паре круглых скобок может быть все что угодно, кроме символа кавычки. Поэтому дойдя по первой кавычки интерпретатор остановится и заьепет в переменную $1 только то что между кавычек. В квадратных скобках указано - "любые символы кроме правой угловой скобки" - то же самое, дойдя до закрывающей угловой скобки, выражение перейдет к поиску следующей части шаблона. Вторая пара круглых скобок аналогична первой.

Если будут по-прежнему проблемы, почитайте про "жадность" квантификаторов, или напишите сюда снова.
Back to top
View user's profile Send private message Send e-mail
akam
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 06, 2007 3:37 pm (спустя 4 часа 3 минуты; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

все. значения я снял вот таким вот образом:
for($response->content =~ m/title=\"([^"]{11,}?)\".+?href=\".+?id=(\d+:\d+)/gsc) {
    chomp;
    print "$_\n";
}

только почему-то в переменной $1 и $2 постоянно одно значение - первое попавшееся. почему так может быть? с c while такой болк не работает...
Back to top
GreenFactory
Заглянувший



Joined: 26 Oct 2006
Posts: 8
Карма: 0
   поощрить/наказать


PostPosted: Wed Feb 07, 2007 1:24 am (спустя 9 часов 46 минут; написано за 3 минуты 21 секунду)
   Post subject:
Reply with quote

Один из простых вариантов(скорее всего не самый красивый, но рабочий)
Code (perl): скопировать код в буфер обмена
#!/usr/bin/perl
use strict;

$_='<td title="i20-56"><a href="/link">что еще...<td title="текст"><a href="/link2">.... и дальше в том же духе';

my $switch=1;
while($switch)
    {
    if(s (www.perldoc.com/perl5.6/pod/func/s.html)/(title|href)="([^"]*?)"//)
        {
        print "
$1 = $2\n";
        }
    else
        {
        $switch=''
        }
    }
А вообще, вот сайт perldoc.narod.ru/, там "ищем учебник по regexp от Стива Холзнера"
Замечательная вещь, сам её изучил, и периодически возращаюсь
Back to top
View user's profile Send private message
akam
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 9:47 am (спустя 1 день 8 часов 22 минуты; написано за 26 секунд)
   Post subject:
Reply with quote

всем спасибо за ответы

Вопрос решен, тему можно закрыть.
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 129
   поощрить/наказать


PostPosted: Thu Feb 08, 2007 3:50 pm (спустя 6 часов 3 минуты)
   Post subject:
Reply with quote


М

Тема закрыта.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You cannot download files in this forum.
XML