1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

HTML::Parser - кто знает?

Тема в разделе "Программирование", создана пользователем ViT, 27.11.05.

  1. ViT

    ViT Активный участник

    998
    0
    HTML::Parser - нужна помощь!!

    Пожалуйста, помогите, а то тех примеров что в документации мне не хватило.
    Есть переменная $data, к примеру.
    В ней содержится HTML-код страницы.
    Нужно выбрать значение тега <div class="XXX"...>ЗНАЧЕНИЕ</div>

    Т.е. если имя тега DIV, а class=XXX, то вывести значение тега.
    Пожалуйста, покажите как это будет.
    А то у меня не получилось :(
     
  2. The Last Winged

    The Last Winged Активный участник

    11.862
    48
    perldoc perlrequick
    perldoc perlretut
     
  3. ViT

    ViT Активный участник

    998
    0

    Регулярные выражения не подходят
    Нужно именно через HTML::Parser
     
  4. ViT

    ViT Активный участник

    998
    0
    Вопрос по поводу HTML::Parser все еще открыт.

    А чере регулярные выражния не могу выбрать.
    Вот самое "ЗНАЧЕНИЕ" может содержать такие символы:
    ,./-()"
    \w
    \s


    Я наисал:
    $text =~ m%<div class="XXX">([\w\s\.,\(\)"-/]+)</div>%g
    Но не работает.
    Где ошибка? Что не так?

    Если писать:
    $text =~ m%<div class="XXX">(.+)</div>%g
    То выдается совсем не то, в силу того, что этих тегов на странице много, и таким способом результатом получается все, что содержится между первым открывающим и последним закрывающим тегами на странице.


    Пожалуйста, помогите!
     
  5. Vaulter

    Vaulter Активный участник

    1.622
    0
    <div([^c>]+class="XXX">([^</div>]+)</div>
    я начал бы вот с этого...
     
  6. ViT

    ViT Активный участник

    998
    0

    ЭЭэ ... здесь есть одно НО:
    Класс [^</div>] имеет префикс ^, что озачает что все что будет после него - нам не нужно, а так это класс, то смотрится КАЖДЫЙ из символов: т.е. / считается для нас как ненужный символ!!! А я выше написал, что / допустим в искомом тексте.
     
  7. ViT

    ViT Активный участник

    998
    0
    А вот так рабоает как надо:

    <div class="XXX">([^<]+)</div>

    Но вот хотелось бы узнать, как же все-таки это делается с помощью HTML::Parser.
    Если самостоятельно раньше разберусь - опубликую здесь ;)
     
  8. d_oleg

    d_oleg Участник

    1.439
    0
    даже если внутри <div></div> есть другие тэги? Сомнительно мне это...

    тебе тут прально писали - rtfm, а именно man HTML::Parser.

    Обычный парсер, осованный на событиях.
    Создаешь объект
    $p = HTML::Parser->new(бла-бла-бла);

    устанавливаешь обработчики событий
    $p->handler( event => \&subroutine, $argspec )

    и обрабатываешь html-документ
    $p->parse_file("foo.html");


    В обработчиках уже определяешь поведение твоего скрипта по событиям открытия и закрытия интересующего тебя тэга.
     
  9. ViT

    ViT Активный участник

    998
    0
    Нет, конечно эе если теги внутри будут - то, нет. Но просто в моем варианте тегов внутри нет - 100%.

    По поводу парсера:
    1 и 3 понятно.
    2 - нет:
    Когда устанавливается обработчик событий, указывается подпрограмма, которая будет выполнять каки-то действия - \&subroutine. Так?
    А $argspec - это аргуемнты, которые ей передаются?
    Что ей нужно передать, чтобы она проверила название тега (tagname) и атрибут, которым в моем случае является класс (class="XXX") - attr ???
    И как потом в самой &subroutine к ним обращаться? Как я понял в нее передадутся хеши, и будет в моем случае 2 ключа - имя и атрибут???
    И еще: обработчику надо показать, что мне нужен атрибут class, а в самой подпрограмме уже проверять чему он равен XXX или нет. Так? Как это сделать?