Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > HTML::TableExtract получение значений ячеек


Автор: Зюзе 10.6.2009, 11:57
Добрый день. Накатал скрипт который получает из HTML странички таблицу:

Код

use strict;
use LWP::UserAgent;
use HTTP::Request;
use HTML::TableExtract;
#use HTML::TableExtract qw(tree);
use HTML::Tree;
use Data::Dumper;
my $ua = LWP::UserAgent->new(timeout => 10);
my $url = 'file:/c:\Perl\bin\bid.htm';
my $request = HTTP::Request->new('GET',$url);
my $response = $ua->request($request);
my $content = $response;
my $te = HTML::TableExtract->new( headers => [qw(Bid Ask Last)] );
$te->parse($content);
print $te->as_text;
#print $te;
#print Dumper $te;
#print $content;


застрял на том, как получить значения ячеек таблицы из этого $te  smile  smile  smile 

Таблица в bid.htm простая, выглядит так:
Bid  Ask Last
100 400 700
200 500 800
300 600 900
 
подскажите как получить значения ячеек... smile  


 

 

Автор: shamber 10.6.2009, 12:19
perldoc пробовали?

Код

foreach my $ts ($te->tables) {
   print "Table found at ", join(',', $ts->coords), ":\n";
   foreach my $row ($ts->rows) {
      print "   ", join(',', @$row), "\n";
   }
 }


Автор: Зюзе 10.6.2009, 16:14
shamber, добавил что вы написали, теперь выводит:
Global symbol "$ts" requires explicit package name at 2.pl line 24.
Global symbol "$ts" requires explicit package name at 2.pl line 25.
Global symbol "$row" requires explicit package name at 2.pl line 26.
Global symbol "$ts" requires explicit package name at 2.pl line 26.
Global symbol "$row" requires explicit package name at 2.pl line 27.
требует, какое то имя пакета, как это поправить ? 
З.Ы. 
убрал use strict; после этого заработало, выводит 
Код

HTML::TableExtract=HASH(0x1cc663c)

и все. 
Как можно проверить что он там насобирал ?
З.З.Ы.Я с перлом 2 раз дело имею  smile 
Не подскажете как в perldoc попасть ?

Автор: KSURi 10.6.2009, 18:30
Цитата(Зюзе @  10.6.2009,  16:14 Найти цитируемый пост)
Не подскажете как в perldoc попасть ?

Очевидно, командой perldoc. Или, не менее очевидно, через сайт http://perldoc.perl.org

Автор: shamber 10.6.2009, 21:07
Цитата(Зюзе @  10.6.2009,  16:14 Найти цитируемый пост)
требует, какое то имя пакета, как это поправить ? 

Я подредактировал свой пост. там уже исправлено

Цитата(Зюзе @  10.6.2009,  16:14 Найти цитируемый пост)
Как можно проверить что он там насобирал ?

решеточку снимите smile
Цитата(Зюзе @  10.6.2009,  11:57 Найти цитируемый пост)
#print Dumper $te;



Автор: Зюзе 11.6.2009, 10:06
shamber, я наверно тупой  smile 
Код

HTML::TableExtract=HASH(0x1cc47e4)
$VAR1 = bless( {
                 '_ts_sequential' => [],
                 'headers' => [
                                'Bid',
                                'Ask',
                                'Last'
                              ],
                 'br_translate' => 1,
                 'gridmap' => 1,
                 'strip_html_on_match' => 1,
                 'subtables' => undef,
                 'decode' => 1,
                 'keep_headers' => 0,
                 '_in_a_table' => 0,
                 'debug' => 0,
                 '_tables' => {},
                 '_cdepth' => -1,
                 'count' => undef,
                 'automap' => 1,
                 'error_handle' => \*::STDOUT,
                 'depth' => undef,
                 'keep_html' => 0,
                 'attribs' => undef,
                 '_hparser_xs_state' => \25734300,
                 'slice_columns' => 1,
                 '_counts' => [],
                 '_tablestack' => []
               }, 'HTML::TableExtract' );

но где тут значения ячеек ?  smile  smile  smile 

Автор: shamber 11.6.2009, 10:37
Хорошо, пойдем другим путем.
Приложите ваш html файл. Будем думать

Автор: Зюзе 11.6.2009, 10:40
что-то через форум не выкладывается, залил сюда http://dump.ru/file/2883028

Автор: shamber 11.6.2009, 13:08
У вас косяк в скрипте замените 12 линию на 
Код

my $content = $response->as_string;

И будет вам хорошо smile

Как-то так
Код

use strict;
use LWP::UserAgent;
use HTTP::Request;
use HTML::TableExtract;
#use HTML::TableExtract qw(tree);
#use HTML::Tree;
use Data::Dumper;
my $ua = LWP::UserAgent->new(timeout => 10);
my $url = 'file:/c:/Perl/!My/vingrad/html/bid.htm';
my $request = HTTP::Request->new('GET',$url);
my $response = $ua->request($request);
my $content = $response->as_string;
my $te = HTML::TableExtract->new( headers => [qw(Bid Ask Last)] );
$te->parse($content);

foreach my $ts ($te->tables) {
   print "Table found at ", join(',', $ts->coords), ":\n";
   foreach my $row ($ts->rows) {
      print "   ", join(',', @$row), "\n";
   }
 }

Автор: Зюзе 11.6.2009, 13:24
shamber, спасибо огромное, все заработало.
Жалко плюсануть не могу постов не хватает :(

Автор: shamber 11.6.2009, 13:33
Раз плюсануть не можете, то хоть галочку поставьте, что вопрос решен smile

Автор: Зюзе 11.6.2009, 13:43
поставил  smile 

Автор: mario315 11.6.2009, 15:38
А если столбцы записаны русскими буквами, то не работает. Как быть в этом случае?

Автор: shamber 11.6.2009, 15:54
mario315, Encode?

Автор: mario315 11.6.2009, 18:26

Цитата(shamber @  11.6.2009,  15:54 Найти цитируемый пост)
mario315, Encode? 


Что-то не пойму как работает

Страница в кодировке UTF-8

Код

use strict;
use LWP::UserAgent;
use HTTP::Request;
use HTML::TableExtract;
use Encode;
use HTML::Tree;
use Data::Dumper;

my $ua = LWP::UserAgent -> new();
my $url = 'http://localhost/file.php';
my $request = HTTP::Request -> new('GET', $url);
my $response = $ua ->request($request);
my $val = "Цена";
my $encodeval = encode("utf8", $val);
my $content = $response -> as_string;
my $te = HTML::TableExtract -> new( headers => [$encodeval] );
$te -> parse($content);

foreach my $ts ($te -> tagles) {
             print 'table founda at ', join(',', $ts -> coords), ':\n';
             foreach my $row ($ts -> @$rows) {
                      print ' ', join(',', @$rows), '\n';
             }
}


Ничего не получается. Если вместо Цены подставить Price, то все работает. Как бы сделать, что бы и с Ценой работало?

Автор: shamber 11.6.2009, 21:53
А вообще где в вашем скрипте use utf8; недавно обсуждали по поводу Encode  utf  и прочее поищите. Почитайте

Лучше использовать Encode::from_to("кодировка файла","utf",$var);
Или http://forum.vingrad.ru/index.php?showtopic=256131&view=findpost&p=1848210

Автор: mario315 12.6.2009, 14:36
shamber, спасибо, глянул поиск. Тем и вправду предостаточно.

Автор: mario315 12.6.2009, 17:51
Проблема была в редакторе. Даже не знаю в какой кодировке он сохранял. Заюзал другой - стало все нормально.

Автор: Зюзе 16.6.2009, 13:12
mario315, получить значения ячеек можно так:
my $t = $te->first_table_found; 
$t->cell(0,0);
$t->cell(0,1); и т.д...

Автор: mario315 19.6.2009, 17:35
Появилось два вопроса

ПЕРВЫЙ

Начинаю так
Код

$ts -> rows();


Что дальше делать не знаю. Если выводить на печать, ты выводит количество массивов, соответствующих количеству строк.
А как просто получить количество строк?

ВТОРОЙ

Если в ячейки таблицы содержится html-код, как его получить?

Попробовал сделать как http://search.cpan.org/~msisk/HTML-TableExtract-2.10/lib/HTML/TableExtract.pm, но из- за строки 
Код

use HTML::TableExtract qr(tree);    
 вылетает ошибка
Код

Unknown mode '(?-xism:tree)'
 at tableextract.pl line 4
BEGIN failed--compilation aborted at tableextract.pl line 4.

как тут быть?

Автор: shamber 20.6.2009, 14:10
количество строк 
Код

my $count;
   $count = @$count = $ts->rows;

Автор: ginnie 22.6.2009, 13:04
Цитата(shamber @  20.6.2009,  14:10 Найти цитируемый пост)
$count = @$count = $ts->rows;

Может лучше 

Код

$count = () = $ts->rows;


хотя самый лучший (по читаемости) вариант 

Код

my @rows = $ts->rows;
my $count = @rows;

Автор: shamber 22.6.2009, 14:01
Цитата(ginnie @  22.6.2009,  13:04 Найти цитируемый пост)
хотя самый лучший (по читаемости) вариант 

согласен.

Автор: Cyr 3.11.2015, 13:41
удалено

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)