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


Автор: Mosaicolor 6.8.2006, 13:22
Значит задача такая:

Скопировали модулем LWP::UserAgent некий HTML-файл и записали его на сервер.

Код

#!/usr/local/bin/perl 

use strict;
use warnings;
use LWP::UserAgent;

my $url = "http://мой_домен.com";
my $agent = new LWP::UserAgent();
my $request = new HTTP::Request('GET' => $url);

   print "Content-type: text/html\n\n";

my $response = $agent->request($request);

my $page = $response->content();

open(FILE,">/home/path/www/cgi-bin/index.dat");

   print FILE "$page";

close(FILE);


Теперь требуется:

А. Вытащить все ссылки в файл links.dat 
Это сделано (нашел на этом форуме)

Код

open( READ, "< index.dat" ) or die $!;
open(WRITE, "> links.dat") or die $!;
s/href=(?:\"|\')?(.+?)(?:\"|\')(?:>|\s)/print WRITE qq[$1\n]/eig while (<READ>);
close(WRITE);
close(READ);


Б. Вытащить содержимое тега TITLE в файл title.dat 

Чтобы внутри файла было: <TITLE>Текст заголовка </TITLE>

Как сделать не знаю

C.  Б. Вытащить содержимое тега HEAD в файл head.dat 

Чтобы внутри файла было: 
<HEAD>
Все вложенные теги
</HEAD>

Как сделать не знаю

D. Вытащить содержимое тега BODY в файл body.dat 

Чтобы внутри файла было: 
<BODY>
Все вложенные теги и тексты
</BODY>

Как сделать не знаю


Поможите?




Автор: Nab 6.8.2006, 14:41
Цитата(Mosaicolor @ 6.8.2006,  13:22)

Как сделать не знаю x 3

HTML::Parser

Цитата(Mosaicolor @ 6.8.2006,  13:22)

Поможите?

А смысл?

Автор: nitr 6.8.2006, 22:28
Mosaicolor, тут же огромный форум smile Тем более уже пользовался... К примеру, выборка ссылок, тоже пример по работе с регулярными выражениями. Если вы не перл-программист или непрограммист вообще, то решение такое

Код

#!perl
use strict;

...
open INDEX, '<', 'index.dat';
local $/;
my $index = <INDEX>;
close INDEX;
my @tags = ('title', 'head', 'body');
foreach (@tags) {
    my $file = $_.'.dat';
    $index =~ /<$_>(.+)<\/$_>/smi;
    open FILE, '>', $file;
    print FILE $1;
    close FILE;
}

Автор: nitr 7.8.2006, 00:43
две строки в одну мона
Код

my @tags = ('title', 'head', 'body');    
foreach (@tags) {

в
Код

foreach (qw(title head body)) {

Автор: nitr 7.8.2006, 01:01
кстати... решение всех твоих задач ;)

Код

#!perl
use strict;
use LWP::UserAgent;

#my $ua = LWP::UserAgent->new;
#open INDEX, '>', 'index.dat';
#print INDEX $ua->get('http://forum.vingrad.ru/index.php?showtopic=107053')->content;
#close INDEX;
open INDEX, '<', 'index.dat';
local $/;
my $index = <INDEX>;
close INDEX;
open LINKS, '>', 'links.dat';
print LINKS $1."\n" while $index =~ m{<A[^>]*?HREF=["'](.+?)['"][^>]*?>.*?</A>}smig;
close LINKS;
foreach (qw(title head body)) {
    my $file = $_.'.dat';
    $index =~ /<$_>(.+)<\/$_>/smi;
    open FILE, '>', $file;
    print FILE $1;
    close FILE;
}


меньше кода, неправда ли? Но и его можно сократить... и оптимизировать... ;)

Автор: Mosaicolor 8.8.2006, 11:51
Огромное спасибо!

Все работает.
Выявилась, правда, одна проблемка, но пытаюсь ее решить сам.

А проблема такая. Например, тег <BODY>

- при написании тега <BODY> - все в порядке
- но при написании <BODY onload тра-та-та onclick тра-ла-ла...> - не работает

Не слишком большой наглостью с моей стороны будет попросить помощи и в решении этого?

Автор: nitr 8.8.2006, 13:12
smile))
я ж для примеру пишу... и вроде говорил, читай книжки ;)
строку №18 ($index =~ /<$_>(.+)<\/$_>/smi;)
меняй на
Код

$index =~ /<$_[^>]*?>(.+)<\/$_>/smi;

З.Ы.: прочти некоторые статьи, книги. Множество книг есть на форуме, переведённые доки... ищи и гляди... Изучай!

Автор: rcdimon 8.8.2006, 20:15
Конечно! Все можно по красоте сделать через регулярки. Нафиг хтмл::парсеры.... Нет конечно это клева, но чисто ради прикола или повышения квалификации стоит и самому пописать такие штуки. Молодец нитр smile

Автор: nitr 8.8.2006, 21:13
Цитата(rcdimon @  8.8.2006,  20:15 Найти цитируемый пост)
 Нафиг хтмл::парсеры.... Нет конечно это клева, но чисто ради прикола или повышения квалификации стоит и самому пописать такие штуки. Молодец нитр smile

Спасибо smile)
Имхо проще так... для такой простой задачи... ;)
З.Ы.: человек не понимает о чём мы говорим ;) Вы устанете объяснять как установить модуль ;) Имхо - быстрое, готовое решение ;)

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