среда, 1 июля 2009 г.

TextPipe Pro - пример обработки HTML-файла

TextPipe Pro

Программа TextPipe Pro предоставляет огромные возможности по обработке текстовых файлов.
Но не смотря на довольно большое количество учебных и демонстрационны материалов, освоить эту программу не всегда легко удаётся.

Для того, чтобы продемонстрировать на конкретном примере возможноси программы TextPipe Pro, я подготовил этот небольшой мануал.

Он не даёт ответов на все вопросы, но он поможет тем, кто начинает осваивать эту программу, сделать в ней первые шаги. А дальше, поверьте, освоение пойдёт гораздо проще.

Все рабочие материалы к этому мануалы я залил одним файлом на рапиду. Можете скачать отсюда.

Я буду ссылаться в тексте на некоторые файлы из этого комплекта. Но на самом деле качать его не обязательно - если повторять по шагам все описанные операции, всё будет и так понятно.

Итак, возьмём вот такую распространённую задачу: нужно из HTML-кода страницы с интересующей нас статьёй выделить только текст статьи и заголовок, удалив всё лишнее.

Для чего это может быть нужно?
Например для сбора текстов, их дальнейшей обработки (синонимайзинг, рерайт, перевод) и наполнения своих сайтов.

Возьмём случайную статью. Например эту: http://stroybm.ru/articles/kadry/20090624134642/index.html

Исходный код в приложенном файле "html_code_text.txt"

Для начала нужно выделить код только статьи из кода всей страницы. Это решается заменой. И я с этим сам всегда мучаюсь.
Суть простая. Найти какой-то неповторимый элемент страницы ДО основной статьи и сразу ПОСЛЕ неё.
И потом заменить по типу "Всё до, включая..." и потом "Всё после начиная с..."

В нашем случае уникальный элемент "ДО", это

Чтобы TextPipe заменил всё от начала страницы до этого элемента (включая его), нужно задать ему команду:

Поиск и замена -> Найти схему (стиль old egrep)

Указать в поле для данных:

Выбрать Action -> Remove

И всё. Он удалит нам всё до этой строки.

Скрин (все картинки кликабельны):

TextPipe Pro мануал

Теперь пройдём по поряду по коду этой строки, чтобы было понятно для чего тут что.

Итак. Ещё раз. Оригинал уникальной строки:

а изменённая строка:

. - это любой знак, т.е. мы говорим программе: "Ищи любой знак"
* - это любое количество, т.е. мы добавляем программе "Ищи любое количество любых знаков"
- это наш уникальный код, в который вставлен экранирующий символ "\"
этот знак говорит программе - то что стоит за этим знаком, это не программный код (не спецсимвол для макроса), а обычный текст.
Т.е. программа при обработке такой строки знаки "\" просто выкидываются.

Я экранирую всё что может быть расталковано как спецсимволы. Фактически, список этих символов определён, его можно изучить по help`у.
Но если есть сомнение, спецсимвол в коде или нет - его лучше заэкранировать. Это позволит измежать массы возможных проблем с отладкой макроса.

Проверить что получилось на промежуточном этапе можно запустив учебный прогон:

TextPipe Pro Учебный прогон



Теперь нужно удалить всё лишнее после текста.
В этом случае уникальный элемент текста:

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

Это также делается при помощи команды: Поиск и замена -> Найти схему (стиль old egrep)

Вот так будет выглядеть команда:



TextPipe Pro команда

В итоге при учебном прогоне получаем текст самой статьи, обрезанный спереди и сзади (файл text_article_cutted_front_end.txt).
Но в нём остаётся много мусора.
Ссылки, пустые строки.

Это мы сейчас оперативно и просто почистим.

Для того, чтобы убрать вообще все тэги в статье (к сожалению, это "убьёт" и все картинки и оформление, которое возможно, хотелось сохранить).
Это самый простой способ. Универсальный. Для каких-то конкретных случаев можно придумать более сложный вариант очистки кода, но пока не будем углубляться.

Удалить -> HTML and XML -> Remove all tags

TextPipe Pro Удалить тэги

Ну и сразу удалим пустые строки из статьи, если они нам не нужны.

Удалить -> Пустые строки

TextPipe Pro удалить пустые строки

В итоге получаем вот такой вот обработанный текст (файл text_article_cutted_2.txt)

В этом файле всё ещё остаётся очень много мусора.
Например:
Также есть табуляции, и прочие мешающие нам элементы.

Добавим ещё пару команд:

Поиск и замена -> Найти точно

Вводим то, что нужно заменить. Конкретно:
В Action выбираем Remove

Либо можем выбрать Replace и заменить на пробел. Но в нашем случае Remove будет корректнее.

Обязательно проверяем, чтобы не была поставлена галочка "Замена только первого". Иначе не весь текст будет очищен от этого символа.

TextPipe Pro замена

А также добавляем команду удаления многих пробелов идущих подряд:

Удалить -> Многие пробелы

TextPipe Pro удалить многие пробелы

То что получилось, уже гораздо лучше, но всё ещё содержит не нужные нам строки, такие как:



А также есть поробелы в начале строки, и пустые строки в конце статьи. Ну и автор. Нужен он нам или нет? Покажу пример, когда не нужен.

То что осталось проще всего обработать удалением строк по номерам.
Лично я так и делаю. Наверняка есть более элегантные и универсальные способы. Но у меня получается этот. Его и продемонстрирую.

Удалить -> Удалить строки -> Удалить диапазон строк

Указывае нужные диапазоны. Чтобы удалить первую пустую строку это будет 1 и 1:

TextPipe Pro удаление строк

Для блока, идущего после названия статьи (имеем ввиду, первая строка уже удалена, строки сместились и отсчитывать теперь нужно от новой первой строки - названия, т.е. со 2-й по 7-ю строки):

TextPipe Pro удаление строк 2

Теперь удаляем строки с конца файла. Если хотим убрать и данные об авторе, убираем последние 6 строк. Если хотим оставить информацию об авторе, тогда нам надо удалить 4 строки с конца файла.

TextPipe Pro удаление строк

Как финальный штрих - убираем пробелы в начале строк:

Удалить -> Пустоты в начале строки

TextPipe Pro Пустоты в начале строки

Всё, вот такой вот итоговый текст мы получили: (файл text_article_final.txt)


Если его закидывать в Wordpress в виде HTML, то больше чистить его не нужно.
Если будем использовать его как текст, то нужно вычистить также такие символы:



ну и другие, которые остались в тексте после всех наших манипуляций.
Делается это также:

Поиск и замена -> Найти точно

Вводим то, что нужно заменить.
В Action выбираем Remove


Я это делаю не всегда.
Т.к. в большинстве сучаев такие элементы мне уже не мешают.

Вот, собственно, и всё. Можно в синонимазер статью закидывать, можно сразу публиковать.

Для того, чтобы статья сохранилась в текстовый файл, нужно будет настроить вывод.
Вместо "Выводить в буфер обмена" (последняя строка макроса), заменяем настройки как показано на рисунке:

TextPipe Pro вывод данных

Все настройки, по моему, вполне понятны. Варьировать можно под свои нужды.

А для того, чтобы TextPipe знал что ему, собственно, обрабатывать, все исходные файлы со статьями (в нашем случае это 1 файл) нужно добавить в список файлов в обработке:

TextPipe Pro файлы

Для этого нужно просто перетащить нужный файл из проводника в окошко TextPipe Pro.

Кроме того, как в моём примере, можно скопировать содержимое обрабатываемой страницы в буфер обмена Windows и запустить обработку.

Настраивается источник для обработки в самой первой строке фильтра:

TextPipe Pro источник

Проверяем как всё работает - запускаем реальный прогон.

TextPipe Pro реальный прогон

В сервисном окошке нам покажут все проводимые операции:

TextPipe Pro результаты работы

Если при обработке возникнут ошибки - они будут показаны красным.

Обработанный материал сохраняется в текстовом файле в папке, которую мы указали.

Если мы обрабатывали данные из буфера - это будет 1 файл. Если брали список файлов - то несколько.

Можно также все файлы сохранять в 1 итоговый текстовый файл. Это настраивается в последнем шаге макроса:
Один файл вывода (объединить файлы вывода вместе).

Кстати, есть ещё два момента.

Если сначала сделать удалить все пробелы в начале строк, а потом убрать пустые строки, то весь текст получится одним большим куском, без пустых строк между абзацами.

Для восприятия человеком это не так удобно. Но для говноблогов, доров и т.п. - вполне подойдёт.

Тогда немного меняется удаление лишних строк. Но тут, как говорится, кому как удобнее.

И второе - наш макрос мы составили для обработки конкретного кода, конкретной страницы.

Проделывать такую работу ради создания макроса для обработки одной единственной страницы - безсмысленно.

Но в большинстве случаев, статьи на сайте имеют типовой формат. Это относится к блогам, каталогам статей и т.п.

Там, где используется какая-то CMS, почти всегда все статьи имеют одинаковый формат (или очень близкий), поэтому написав макров для обработки одной статьи, мы автоматически имеем возможность обработать все статье и с этого сайта.

Но только с этого сайта. Для других нам придётся немного (а иногда полностью) менять код макроса, создавая его по тому-же принципу, как я расписал выше.

Давайте проверим.
Берём ещё какую-нибудь статью с того-же сайта. Например:
http://stroybm.ru/articles/nedvijimost/20090610092658/index.html

Статья, как и в первом случае, выбрана совершенно случайно.

Берём её код (файл html_code_text_2.txt) и помещаем в зону учебного прогона.


Делаем учебный прогон ничего не меняя в настройках макроса.

Сделали и получили отлично обработанный текст (файл text_article_final_2.txt).

Вуаля! У нас готов макрос для обработки всех статей с сайта http://stroybm.ru/.
Не плохо.

Готовый макрос я также залил (файл macros.fll).

Вот, собственно, таким образом можно обрабатывать тексты для наполнения своих сплогов.

16 комментариев:

Redmonk комментирует...

Xupypr пишет...

я хожу другим путем )

ТоталКомандер - ааа.тхт - Ф3 - Стрл+А - Стрл+С - Еск - Ф4 - Стрл+А - Стрл+В

как то так )

Xupypr (извини, потёр твой каммент, т.к. ссылка не твой фарма-шоп, ну просто никак не подходит для моего блога), было бы очень интересно поподробнее познакомиться с твоей методикой.

Ты мог бы чуть подробнее всё то-же самое расписать. В идеале - с примером.

Т.к. если TotalCommander это быстрее и проще - то можно было бы использовать и такой вариант.

И как ты удаляешь ссылки из текста и прочий мусор?

Socialink комментирует...

А как сделать замену каждой строки файла, находящейся в определенных тегах (например http://...) на строку из другого текстового файла (список url)?

Redmonk комментирует...

Socialink,
Разных всяких вариантов, как обрабатывать файлы огромное количество.

Всё очень доходчиво расписано в мануале, а также в этой ветке было очень много практических примеров разобрано, как конкретно использовать программу:
http://www.nulled.ws/showthread.php?t=8222

Рекомендую к изучению.

Анонимный комментирует...

Здравствуйте. необходимо сделать такое действие в TextPipe:
имеется список:
1
2
3
4
имеется второй список:
a
b
с
d
e
f
g и тд
Необходимо дублировать каждую строчку первого списка определенное количество раз и соединить со вторым списком, чтобы получился такой вид:
1 a
1 b
1 c

2 d
2 e
2 f

3 g
3 k
3 l

4 m
4 n
4 и тд
возможно это сделать, может быть в 2 шаблона?
спасибо.

Redmonk комментирует...

Я бы это сделал при помощи php-скрипта.
Не сталкивался с такой задачей.

На нулледе задай вопрос - там ветка по TextPipe - отвечают быстро и по делу.

Удачи.

Анонимный комментирует...

Добрый день! Не подскажете, как сделать простейшую (наверное) операцию: удалить всё что находится между парами конкретных слов.

Допустим, удалить всё, что между A и B.

ashdajd a jijifswfsdf b lossdfsdfsd a podsfodsdfsdf b
>>
ashdajd a b lossdfsdfsd a b

Redmonk комментирует...

Сделайте поиск и замену по регулярному выражению.

Анонимный комментирует...

Спасибо за статью, подробно и понятно написал.
А можно с помощью программы сделать так, чтобы бралось строка из CSV файла (рандомно или по очереди) и добавлялись в txt файл в конец, потом бралась еще строка (без повторов) из CSV и в новый txt.

На нулледе не то что тему создать, так там даже не пускают в этот раздел.

Заранее спасибо.

Redmonk комментирует...

Да, скорее всего это возможно.
Но я сейчас использую для решения подобных задач ZennoPoster.
Очень удобная штука.

Den комментирует...

Уже вторую ночь мучаюсь. Вот один из примеров:
- надо удалить вот эту строку: <_in_put ty_pe="sub_mit" na_me="submitBuy" va_lue="КУПИТЬ"_>

Выбираю фильтр "Поиск и замена", в поле "Найти" вставляю кусок кода, тип поиска - точно, действие "Удалить".

На учебном прогоне, всё работает. Когда нажимаю кнопку "Делать (реально)", ничего не меняется.

Redmonk комментирует...

Я сталкивался с подобной проблемой. Решение оказалось очень простым - смена кодировки исходных файлов.
Т.е. у меня файлы некорректно обрабатывались, допустим (точно уже не помню) в ANSI, но после перекодировки в UTF-8 заработали.

Есть программы для массовой смены кодировки. Сейчас название не вспомню.
Можно для пробы также в Notepad++ сделать перекодировку.
Кодировки -> Преобразовать в UTF-8

Если не получится - пиши, будем разбираться в чём ещё может быть дело.

Den комментирует...

Спасибо за совет! Всё получилось. Проблема была в кодировке.

Анонимный комментирует...

Спасибо за статью: очень познавательно! Подскажите пожалуйста, может ли textpipe обьединять большое количество файлов в 1?

Redmonk комментирует...

Для объединения большого количества файлов в один я его не использовал. Но, думаю, он вполне с этим справится.

Анонимный комментирует...

Анонимный пишет...
Добрый день! Не подскажете, как сделать простейшую (наверное) операцию: удалить всё что находится между парами конкретных слов.

Допустим, удалить всё, что между A и B.

ashdajd a jijifswfsdf b lossdfsdfsd a podsfodsdfsdf b
>>
ashdajd a b lossdfsdfsd a b

У меня таже проблема с этим. Какие фильтры надо применять?
Ведь задача не простая, потому что между А и Б могут быть разные символы, разной длины, а не регулярное выражение

Redmonk комментирует...

Эта задача решается (и довольно просто) автоматической заменой по регулярному выражению.
Составляете регулярное выражение в котором указываете что искомый текст начинается с A и заканчивается B.
Это, по идее, можно сделать, если эти A и B уникальны и не повторяются в строке между ними.
Не подскажу конкретный код - давно не использую программу.
Но на форуме поддержки, уверен, можно найти информацию по регулярным выражениям.

А дальше найденный кусок кода A ...(что-угодно)... B
заменяем во всём тексте на A_пробел_B
Где _пробел_ - это обычный пробел. Или вообще ничего, если удалить надо полностью.

Такая автозамена по регулярному выражению будет равносильна удалению ненужного кода.

Но если внутри этого текста встречаются A или B - тогда такой подход не подойдёт и придётся искать другое решение.