Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как вытянуть значение HTML тэга с помощью Delphi  (Прочитано 20118 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
krulik
Гость
« : 24-09-2005 09:18 » 

Коротко объясню суть проблемы. Хочу сделать нечто вроде оболочки под справочник. Все статьи хранятся в виде отдельных HTML документов. Мне необходимо при запуске оболочки перебрать все эти файлы. При этом считать содержимое тэга <TITLE> </TITLE> (для формирования содержания). Так вот вопрос возник как считать содержимое этогго тэга в каждом доке.
Я в делфи аматор по этому не пинайте ногами пожалуйста.

Все наверно видели справочник DelphiWorld (если нет то он вот тут www.delphiworld.narod.ru).Так вот мне надо создать нечто похожее. Помогите пожалуйста.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 26-09-2005 07:18 » 

есть два варианта.

первый - тупо читать все страницы, и из каждой выдирать значение тэга великой и могучей функцией Copy. если тэг стоит первым (что, в общем, далеко не факт) - достаточно прочитать первую строку куда-то в "s". чтобы не заморачиваться с регистром, имеет смысл всю строку преобразовать в верхний
Код:
s := AnsiUpperCase (s))
. далее находим начало и конец собственно заголовка:
Код:
StartN := Pos ('<TITLE>', s) + 7; 
EndN := Pos ('</TITLE>', s);
теперь осталось прочитать сам заголовок:
Код:
Title := Copy (s, StartN, EndN - StartN - 1);
код не компилял, так что скорее всего надо будет подправить мелочи, чтобы не читались лишние символы.

способ второй. все страницы заранее хранятся в некоем файле. например, такого вида:
Код:
Title1=Path1
Title2=Path2
...
этот файл прога загружает при запуске в некий Titles: TStringList. теперь доступ ко всем статьям мы можем получить через методы и свойства самого стринглиста: Names (список всех тем), Values (список путей к файлам, где лежат эти темы) и т.д.

второй способ существенно проще, но он потребует дополнительных телодвижений (хоть и несущественных) для организации проги (т.е. - набивки самого файла). первый способ проще тем, что для него достаточно просто положить в определённое место статью. кроме того, для него можно ввести свои собственные теги (автор, ссылки, дата и пр.), которые браузер видеть не будет, но которые будет благополучно обрабатывать программа.
« Последнее редактирование: 04-12-2007 18:53 от Алексей1153++ » Записан

krulik
Гость
« Ответ #2 : 26-09-2005 08:20 » 

Спасиб за помощь. А как нащет парсинга? Мне вот на одном форуме посоветовали пропарсить файл и таким образом вытянуть содержимое. Вот говорят можно использовать вот это (регулярные выражения) http://regexpstudio.com/RU/TRegExpr/TRegExpr.html
Вот код прислали написанный с использованием функций класа TRegExpr:
Код:
procedure TForm1.Button1Click(Sender: TObject);
 function GetTitleTag(const S: String): String;
 begin
   with TRegExpr.Create do
   try
     Expression := '^(?im).*?<title>(.*?)</title>.*$';
     if Exec(S)
       then Result := Match[1]
       else Result := 'No title found';
   finally
     Free;
   end;
 end;

var
 Html: TStringList;
begin
 Html := TStringList.Create;
 try
   Html.LoadFromFile('WinSock Programming.html');
   ShowMessage(GetTitleTag(Html.Text));
 finally
   Html.Free;
 end;
end;
С TRegExpr только начал знакомится (да и с регулярными выражениями вообще), но ознакомившись с синтаксисом был поражен возможностям.
« Последнее редактирование: 04-12-2007 18:54 от Алексей1153++ » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 26-09-2005 08:31 » 

а разбор строки "руками"- вы парсингом не считаете, стало быть? Улыбаюсь или парсинг - это только то, что делает данный конкретный компонент? Улыбаюсь)

ради бога, это уже вопрос удобства. я использую сторонние компоненты только там, где без них физически нельзя обойтись. например, использую FIB+ из-за достаточно критичных глюков родных IBX. в данном случае ради вытаскивания одной единственной строки из файла я бы не юзал чужой код. если для каждой подобной мелочи ставить новые компоненты - ты представляешь, сколько пакетов придётся тащить вместе со своим кодом? но это лирика.

если по существу - первый пример как раз и осуществляет "парсинг" строки. как он будет реализован в конечном итоге - дело хозяйское.
Записан

krulik
Гость
« Ответ #4 : 26-09-2005 09:01 » 

x77 зря так отреагировал на мой последний пост. Я в программировании аматор и слово ПАРСИНГ для меня нечто новое было. Так что когда я спросил  "как нащет парсинга?" я неособо понимал что это такое. Но сейчас почитав малек мне все понятно. А по поводу TRegExpr то ИМХО очень удобно. И по сути зачем придумывать велосипед если он уже придуман.

x77 все равно огромное спасибо за помощь. Я знал что на этом форуме таких как я не упрекают (как на некоторрых форумах) за такие вопросы и ответы.
Записан
Серж
Гость
« Ответ #5 : 26-09-2005 09:38 » 

А можно использовать компоненту TXMLDocument,
она есть в Delphi 6 и далее.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 26-09-2005 09:45 » 

1. я не упрекал ни в коем случае. просто с моей точки зрения, когда приводишь пример парсинга, а тебя спрашивают: всё это хорошо, но как насчёт парсинга?" - это забавно. что я и выразил несколькими смайлами.

2. я и не говорю, что неудобно. но в самих дельфях есть штатный класс - TParser, от которого можно унаследоваться и добавить свой функционал. пойми, если у тебя есть необходимость, например, писать синтаксический анализатор - да, может быть, есть смысл заюзать готовый сторонний компонент. но юзать его ради поиска одной единственной подстроки в наборе файлов - неразумно. потому что потом тебе понадобиться раз в году сложить два и два, и ради этого ты добавить в прогу TSuperCalculator с тремя килограммами dll и собственным com-интерфейсом, и т.д. в итоге, если тебе придётся тривиально переустановить винду на компе, твой проект просто не откомпилиться - тебе придётся ставить все использованные в нём сторонние компоненты. поэтому я противник использовать их без крайней необходимости, как бы они не были удобны. тем более, что включаемый в прогу функционал этого TRegExpr ты будешь использовать максимум на 1%.

3. ещё раз, я не упрекаю, я просто высказываю своё мнение по задаваемым здесь вопросам. u r welcome и всё такое. просто по ряду вопросов наши с тобой мнения не совпали, вот и всё, с чем и почему я не согласен - я сказал Улыбаюсь
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 26-09-2005 09:52 » 

Серж, буду спорить до конца Улыбаюсь)

именно подобный подход (использовать достаточно навороченные компоненты для задач, которые решаются написанием одной единственный собственной функции) виноват появлении на форумах вопросов, типа "какой компонентой в дельфях объявить переменную?". для данной конкретной задачи никакие компоненты не нужны. надо просто написать пять строчек кода. может быть, 10, если считать перебор файлов в директории. использовать TXmlDoc и прочее ради поиска подстроки в файлах, это примерно тоже самое, что добавить TDataSet, чтобы хранить в нём кол-во запусков программы.
Записан

Серж
Гость
« Ответ #8 : 26-09-2005 10:16 » 

Если нужно прочитать только один тег, то конечно компоненты подобного рода не нужны, но аппетит приходит во время еды, и любая информация может оказаться полезной.
Записан
krulik
Гость
« Ответ #9 : 28-09-2005 05:17 » new

Решил сказать два слова про TRegExpr. В состав  TRegExpr входит лишь один pas файл (который естественно добавляется в проект и на этом все). Так что проблем при переустановке никаких не возникнет с поиском утеряных dll. Ну а если честно то я полностью согласн с х77 по поводу использования сторонних библотек.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 30-09-2005 15:09 » 

в продолжение разговора. изо всех сторонних парсеров самым простым и удобным мне показался вот этот: http://www.torry.net/vcl/internet/html/hparse.zip. у него есть одно неудобное свойство, он работать только с файлами на диске, но если в него добавить одно свойство:

Код:
  public
    ...
    property Content: TStringList read FileLines write FileLines;
    ...
  end;
,

то юзать можно будет и "на лету". кроме того, его не надо инсталлировать, просто копируем два файла в свой проект и говорим "uses ...".

а вот что касается TRegExpr, то сей компонент, как пишут сами авторы, совершенно не предназначен для парсинга html. и я с ними вполне согласен. это тулза для синтаксического разбора, но никак не для парсинга, работает она рекурсивно, что для сложных выражений на больших html-документах может стать засадой, и т.д.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines