Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Извлечение текста из html-документа  (Прочитано 25426 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mario_315
Гость
« : 15-06-2009 13:40 » 

Подскажите, пожалуйста, как можно получить текст расположенный между <div class="some_class"></div>.

Пробовал использовать HTML::TokeParser:

Код:
use HTML::TokeParser;

my $p = HTML::TokeParser -> new(shift||'file.html') or die 'can"t open<br>';

while (my $token = $p->get_tag('div class="some_class"')) {
      my $text = $p->get_trimmed_text('/div');
      print "$text\n";
  }

Так не получается. Если ставить просто <div></div>, то все работает.
« Последнее редактирование: 15-06-2009 13:44 от mario_315 » Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 15-06-2009 14:22 » 

Код:
#!/usr/bin/perl -w

use strict;
use HTML::TokeParser;

my $p = HTML::TokeParser->new("file.html") or die "can't open: $!";

$p->{textify} = {div => "dev class=\"some_class\""};

while (my $token = $p->get_tag("div"))
{
      my $text = $p->get_trimmed_text("/div");
      print "$text\n";
}
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
mario_315
Гость
« Ответ #2 : 15-06-2009 16:56 » 

Что-то не получается. Вернее, выводит все элементы <div></div>

Содержимое файла file.html

Код:
<html><body><head>...</head>
<div class="some_class">SOME CLASS</div>
<div class="text">TEXT</div>
<div class="title">TITLE</div>
</body></html>

Прогоняем через
Код:
#!/usr/bin/perl -w

use strict;
use HTML::TokeParser;

my $p = HTML::TokeParser->new("file.html") or die "can't open: $!";

$p->{textify} = {div => "dev class=\"some_class\""};

while (my $token = $p->get_tag("div"))
{
      my $text = $p->get_trimmed_text("/div");
      print "$text\n";
}

На выходе имеем

SOME CLASS
TEXT
TITLE

А хотелось бы, чтоб было только SOME CLASS
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 15-06-2009 18:03 » 

Если исходить из этого: http://search.cpan.org/~gaas/HTML-Parser-3.60/lib/HTML/TokeParser.pm

то:
my $class = $token->[1]{class}
Дальше сравниваем и выводим.
Записан

Удачного всем кодинга! -=x[PooH]x=-
mario_315
Гость
« Ответ #4 : 15-06-2009 18:43 » 

Большое спасибо, PooH и McZim!

Получилось так:
Код:
use strict;
uset HTML::TokeParser;

my $p = HTML::TokeParser -> new('file.html') or die "can't open file";

while (my $token = $p -> get_tag('div')) {

    my $class = $token -> [1]{class};
    if ($class eq 'some_class') {

    my $text = $p -> get_trimmed_text('/div');
    print $text;

    }
}


Добавлено через 7 дней, 12 часов, 30 минут и 3 секунды:
Появился новый вопрос

Есть страница file.html примерно следующего содержания
Код: (HTML)
<html><body>
<DIV class="m_List"><a href="link1.html">link1</a></DIV>
<table class="modelRower">
<tr>
<td><DIV class="m_List"><a href="tablelink1.html">tablelink1</a></DIV></td>
</tr>
<tr>
<td><DIV class="m_List"><a href="tablelink2.html">tablelink2</a></DIV></td>
</tr>
</table>
<DIV class="m_List"><a href="link2.html">link2</a></DIV>
</body></html>

от сюда надо получить ссылки и тексты ссылок, которые находятся в таблице

Делаю так
Код: (Perl)
use HTML::TokeParser;

$p = HTML::TokeParser -> new('file.html') or die "can't open file";
    while ($token = $p -> get_tag('table')) {
     $classtable = $token -> [1]{class};
        if ($classtable eq "modelRower") {

         while ($token2 = $p -> get_tag('div')) {
                $class = $token2 -> [1]{class};
                if ($class eq 'm_List') {

                 while ($token3 = $p -> get_tag('a')) {

                        $url = $token3 -> [1]{href} || "-";
                     $text3 = $p -> get_trimmed_text ('/a');
                        print  "$text3 <b>$url</b><br>";
                    }
        }
     }
}

в результате получаем
tablelink1 tablelink1.html
tablelink2 tablelink2.html
link2 link2.html


а надо только
tablelink1 tablelink1.html
tablelink2 tablelink2.html


Как сделать так, что бы ссылки выдергивались только из таблицы?
« Последнее редактирование: 23-06-2009 07:13 от mario_315 » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 23-06-2009 07:28 » 

Сдается мне, что get_tag работает по всему документу игнорирую вложенность... Поэтому, имхо, надо получить текст таблицы нужной таблицы, из него создать новый документ и в нем искать ссылки.

--
Вот еще нашел, вроде как документ можно в дерево перевести http://search.cpan.org/~petek/HTML-Tree-3.23/lib/HTML/Element.pm
« Последнее редактирование: 23-06-2009 07:40 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
mario_315
Гость
« Ответ #6 : 24-06-2009 00:52 » 

PooH, спасибо. Получилось так:

Код:
use HTML::TreeBuilder;
use strict;
use WWW::Mechanize;

my $mech = WWW::Mechanize -> new();
$mech -> get("http://www.somesite.org/");
my $content = $mech -> content;

my $tree = HTML::TreeBuilder -> new_from_content($content);
my @links = $tree -> look_down('_tag' => 'table', 'class' => 'modelRower');

for my $link (@links) {
    my @cells = $link -> look_down('_tag' => 'a');
    for (my $i = 0; $i < 50; $i++) {
     if ($cells[$i] ne '') {
     my $linkhtml = $cells[$i] -> as_HTML('<>&', 'cp1251');
            $linkhtml =~ m/\<a href\=\"(.*?)\"\>\b\w+\b\D\b\w+\b\<\/a\>/;
            my $text1 = $1;
            print $cells[$i] -> as_text('<>&', 'cp1251'), " ";
            print "<b>" . $text1, "</b><br>";
        }
    }
}

Только с регулярным выражением не совсем то, что надо =)
« Последнее редактирование: 24-06-2009 01:00 от mario_315 » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-06-2009 06:03 » 

PooH, так скорее и есть

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

Мы все учились понемногу... Чему-нибудь и как-нибудь.
santin
Гость
« Ответ #8 : 08-07-2009 17:53 » 

Здравствуйте, а кто сможет подсказать, как мне возможно из всей страницы вытащить только текст описания???

Код:
#!/usr/bin/perl -w

use strict;
use LWP::Simple;

my $url = 'h**p://koodoo.ru/index.php?type=distribution&page=tradegood&tradegoodid=18139';

my $content = getprint($url);
die "Couldn't get $url" unless defined $content;

 Вы уж простите, но я в этом деле новичок, пробовал с помощью HTML::TreeBuilder, HTML::TokeParser; но почему то у меня ничего не получается...
« Последнее редактирование: 08-07-2009 18:27 от Finch » Записан
santin
Гость
« Ответ #9 : 09-07-2009 08:12 » 

Здравствуйте, а кто сможет подсказать, как мне возможно из всей страницы вытащить только текст описания???

Код:
#!/usr/bin/perl -w

use strict;
use LWP::Simple;

my $url = 'h**p://koodoo.ru/index.php?type=distribution&page=tradegood&tradegoodid=18139';

my $content = getprint($url);
die "Couldn't get $url" unless defined $content;

 Вы уж простите, но я в этом деле новичок, пробовал с помощью HTML::TreeBuilder, HTML::TokeParser; но почему то у меня ничего не получается...


Пожалуйста подскажите что мне делать дальше!!!
Воспользовался WWW::Mechanize;
получилось следующее:

Код:
#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
use CGI qw(:standard);

print header(), start_html();

my $mech = WWW::Mechanize->new();

$mech->get("http://koodoo.ru/index.php?type=distribution&page=tradegood&tradegoodid=");
$mech->success or die $mech->response->status_line;

print $mech->title;

exit();

советуют воспользоваться реглярными выражениями, а я их не понимаю вообще, да и с Perl дружу только месяц. Спасибо за понимание Ага
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #10 : 09-07-2009 11:09 » 

Тебе заголовок страницы нужен? Ну так почитай тему...
Я давал ссылку http://search.cpan.org/~gaas/HTML-Parser-3.60/lib/HTML/TokeParser.pm см. там последний пример.
Записан

Удачного всем кодинга! -=x[PooH]x=-
santin
Гость
« Ответ #11 : 09-07-2009 11:13 » 

Нет, не заголовок... мне нужно вытащить описание товара, и только, а весь остальной текст страницы мне не нужен. Последний код работает, просто может через него можно реализовать мои потребности? А черт его знает...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines