Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг файла по тегам, Помогите разобрать файл 
:(
    Опции темы
Mosaicolor
Дата 6.8.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.8.2006

Репутация: нет
Всего: нет



Значит задача такая:

Скопировали модулем 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>

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


Поможите?




PM MAIL   Вверх
Nab
Дата 6.8.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 8
Всего: 37



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

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

HTML::Parser

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

Поможите?

А смысл?


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
nitr
Дата 6.8.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



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 - 6.8.2006, 22:40


--------------------
PM   Вверх
nitr
Дата 7.8.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



две строки в одну мона
Код

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

в
Код

foreach (qw(title head body)) {



--------------------
PM   Вверх
nitr
Дата 7.8.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



кстати... решение всех твоих задач ;)

Код

#!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;
}


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


--------------------
PM   Вверх
Mosaicolor
Дата 8.8.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 6.8.2006

Репутация: нет
Всего: нет



Огромное спасибо!

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

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

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

Не слишком большой наглостью с моей стороны будет попросить помощи и в решении этого?
PM MAIL   Вверх
nitr
Дата 8.8.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



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

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

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


--------------------
PM   Вверх
rcdimon
Дата 8.8.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: 1
Всего: 2



Конечно! Все можно по красоте сделать через регулярки. Нафиг хтмл::парсеры.... Нет конечно это клева, но чисто ради прикола или повышения квалификации стоит и самому пописать такие штуки. Молодец нитр smile
PM MAIL ICQ   Вверх
nitr
Дата 8.8.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



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

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


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.