Разбор файлов - как вытащить нужную информацию. | |
---|---|
maple4 Автор Сообщений: 210 Откуда: Москва Дата регистрации: 26.10.2007 |
В общем, стоит (скорее, стояла...) такая задача:
Из текстового файла (сформированного по какому-то правилу) нужно вытащить НУЖНУЮ информации. Если известны начальная и конечная позиции блока информации, тогда все очень просто. Ну а если эти позиции меняются? К чему тогда можно "привязаться"? Если текстовый файл - страница html, задача значительно упрощается. Якорями (местами "привязки") могут являться характерные комбинации тэгов, особенно если они используют классы или имена. Как пример - главные новости на mail.ru содержатся между якорями <div class="news"> и </div> А вот на lenta.ru информация находится между <TABLE class=peredovica cellSpacing=0 cellPadding=0 width=100% border=0> и </TABLE> Но тут, что бы правильно все вытащить, нужно учитывать парность <TABLE... и </TABLE>, ведь если в содержимом между якорями будет добавлена хотя бы еще одна таблица, результат будет неверным. Первый вариант - использовать объект IE, и вытаскивать то, что надо, последовательно перебирая тэг за тэгом. Вариант второй - IE не использовать. Если присмотреться, блок на lenta.ru заканчивается </TABLE> и далее идет <DIV class=hrg><SPACER type=block></SPACER></DIV> Так вот, что-бы найти нужный </TABLE> можно найти сначала <DIV class=hrg><SPACER... а потом, уже первый от данной комбинации слева - тот самый тэг </TABLE>. А вот если таких новостных блоков несколько? Как быть в данном случае, если требуется вытащить их все? Предлагаю такую схему: 1. Создается некий объект (HC). 2. Ему присваиваются начальный и конечный якоря. 3. Объект по якорям находит начальную и конечную позиции в файле. 4. Если они найдены - вырезается из файла нужный кусок информации, и, далее к шагу 3, но уже к поиску следующих по счету якорей. Если якоря не найдены - выход. Один нюанс, который касается lenta.ru Последний блок не заканчивается <DIV class=hrg><SPACER... Как тогда понять ГДЕ конец блока? Для этого можно привязаться к другой последовательности символов - <TABLE class=podval> и уже от нее найти первую слева комбинацию символов <br>, которая и является якорем конца блока. ... Далее, вся информация используется в своих интересах (от вывода на начальную страницу браузера blank ... до незаконного ![]() Что бы не быть голословным - пример использования ниже. А еще чуть ниже - пример альтернативной работы с объектом с помощью скрипта. И класс в архиве. -------------------------------------------------------------------------------------------
Функции объекта: hc_loadresource (resource) - загрузка текста из файла ресурса . Если ресурс начинается с http:// - берется с Интернет, иначе - локально. Текст загружается в hcv_vhod hc_start_open() - открытие описание начального якоря hc_start_close() - закрытие описание начального якоря и поиск его в содержимом (при неудаче возвращает .f.), запись позиции в hcv_nacalo hc_end_open() - открытие описания конечного якоря hc_end_close() - закрытие описания конечного якоря, поиск его в содержимом (при неудаче возвращает .f.), запись позиции в hcv_konec hc_text(TEXT) - вставка в результат (hcv_vihod) произвольного текста TEXT hc_insert(parameters) - запись в hcv_part содержимого между hcv_nacalo и hcv_konec, и, в зависимости от параметра, запись в результат hcv_vihod hc_pointer(parameters) - перемещение указателя (hcv_ukaz) в нужную позицию hc_tag(TEXT,parameters) - описание якоря. TEXT - символьная комбинация Свойства объекта: hcv_ukaz - позиция указателя. "Перемещается" при поиске якорей. hcv_nacalo - позиция начального якоря hcv_konec - позиция конечного якоря hcv_vihod - результат hcv_part - последний найденный блок hcv_vhod - текст, обрабатываемый объектом hcv_resource - с какого ресурса получен текст Для некоторых методов можно задавать параметры: hc_tag POSITION=-NNNNN|NNNN : где искать комбинацию символов, слева от указателя (при -) или справа, и какой по счету - NNNN. Если не указан параметр, действие аналогично как при POSITION=1 IN=FALSE|TRUE : не входит или входит якорь в результат (касается только последнего, если он составной) CASE=FALSE|TRUE : поиск не зависит или зависит от регистра hc_insert NOINSERT=FALSE|TRUE : НЕ вставлять (TRUE) или вставлять вырезанный блок текста в результат (в hcv_part - находится вырезанный кусок, его можно обработать и решить, что с ним делать дальше) hc_pointer SET=NNNN : перемещение указателя на нужную позицию, например при SET=0 казатель переместится на начало обрабатываемого текста. ------------------------------------------------------------------------------------------- А вот пример того же самого, но сделанного по другому (типа, "смотрите, как еще можно ![]() Предварительно пишется некий файл разбора (не на FoxPro!), называется mailru.txt (кладется в каталог запуска, хотя можно задать и ресурс в Интернет-е, начиная с http:// ).
Далее, уже на FoxPro, создается объект, который и делает всю работу сам:
В общем, два варианта работы с объектом: 1. На чистом FoxPro - в этом случае у Вас полный контроль над объектом 2. Варант со скриптом, который позволяет сделать многое, не особо вникая в Fox. самый новый архив с объектом и примерами работы находится здесь (прямая ссылка на загрузку, 8кб): www.maple4.ru ------------------------------------------------------------------------------------------- P.S. Может, кто делает по другому? Например, с помощью регулярных выражений. P.P.S. Про RSS знаю. ![]() P.P.P.S. Все пока на этапе тестирования. Кроме того, хотелось бы для себя понять - "а зачем?" ![]() Есть возможность развиваться дальше. Например, считывание блока информации размером сколько-то символов, если структура данных статична. ![]() |
Re: Разбор файлов - как вытащить нужную информацию. | |
---|---|
JS Сообщений: 12264 Откуда: Эстония Дата регистрации: 04.09.2000 |
Как все было бы проще, если бы создатели сайтов и их страниц использовали атрибут id. В таком случае, большинство задач бы по разбору информации упрощалась бы многократно, так как есть замечательный метод getElementById. ------------------ Knowledge is better than ignorance! Website: juri.foxhelp.eu ![]() |
© 2000-2025 Fox Club  |