Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

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


Новичок



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

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



У меня есть html страница.
Код

...
<div id="object1">***</div>
...
<div id="object21">***</div>
...
<div id="object12">***</div>
...


Вопрос номер один:
Пользуюсь компонентом HTMLPars. Вот так я делаю чтобы найти <div id="object*">***</div>":
Код

unit Unit1;

interface

uses
  ...
  HTMLPars;
  ...

type
  TForm1 = class(TForm)
  ...
    HTMLParser:THTMLParser;
  ...
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

...

procedure TForm1.Button1Click(Sender: TObject);
var
 s:string;
 j,i:integer;
 obj:TObject;
 HTMLTag:THTMLTag;
 HTMLParam:THTMLParam;
begin
  if HTMLParser = nil then
    HTMLParser:=THTMLParser.Create;
  HTMLParser.OnHTMLParseError := OnHTMLParseError;
  HTMLParser.Memory.LoadFromFile(OpenDialog1.FileName);
  HTMLParser.Execute;

  for i:= 1 to HTMLParser.parsed.count do
  begin
    obj:=HTMLParser.parsed[i-1];
    if obj.classtype=THTMLTag then
    begin
    HTMLTag:=THTMLTag(obj);
    if HTMLTag.Name = "div" then
    begin
      for j:= 1 to HTMLTag.Params.count do
      begin
        if HTMLParam="id" then
        begin
          Pos('object', HTMLParam.value);
          if lPos = 1 then RichEdit1.Lines.add(HTMLParam.value);
        end;
      end;
    end;
  end;
end;
...
end.


Правильно ли я делаю?

Вопрос второй: Как можно отделить "object" от цифр добавляя при этом в RichEdit только цифры?
PM MAIL   Вверх
VICTAR
Дата 24.7.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Guide @  24.7.2008,  14:41 Найти цитируемый пост)
Пользуюсь компонентом HTMLPars.

а кто это?  smile 
Единственное, что могу сказать, что твоя задача легко решается с помощью регулярок.
PM MAIL   Вверх
Alkash
Дата 24.7.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Да и при помощи Pos решить можно)


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Guide
Дата 24.7.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если всё так легко покажите на пальцах пожайлуста!  smile 
PM MAIL   Вверх
VICTAR
Дата 24.7.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

uses RegExpr;

procedure TForm1.btn1Click(Sender: TObject);
begin
  with TRegExpr.Create do
  try
    ModifierI := True;
    Expression := '<div\x20+?id="object(\d+?)">(.*?)</div>';
    if Exec(RichEdit1.Text) then
    repeat
      RichEdit2.Lines.Add(Match[1] + ' - '  + Match[2]);
    until not ExecNext;
  finally
    Free;
  end;
end;

PM MAIL   Вверх
Guide
Дата 24.7.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



VICTAR, У меня Delphi7. Не могу найти RegExpr.dcu в интернете.  smile  Дайте пожайлуста ссылку или напишите другой пример. 

Добавлено: Уже нашел. Болшое спасибо. Уже второй раз выручаете!  smile 

Это сообщение отредактировал(а) Guide - 24.7.2008, 17:42
PM MAIL   Вверх
Guide
Дата 26.7.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Никак не пойму. Скажите пожайлуста, как пропусткать не нужные символы? Например:
Код

...
<td width="412" height="142" class="IdClass">Header1</td>
<div>SomeTextasd</div>
<b>SomeText</b>
<td width="412" align="center"  class="someClass">Description1</td>
<div>SomeTextasdas</div>
<b>SomeTextasdas</b>
<a align="left" href="object1">Link</a>
...
<td width="412" height="142" class="IdClass">Header2</td>
<div>SomeTextasd</div>
<b>SomeText</b>
<td width="412" align="center"  class="someClass">Description2</td>
<div>SomeTextasdas</div>
<b>SomeTextasdas</b>
<a align="left" href="object2">Link</a>
...


Нужно записать Header, Description и ссылку.

Делаю так:
Код

procedure TForm1.btn1Click(Sender: TObject);
begin
  with TRegExpr.Create do
  try
    ModifierI := True;
    Expression := 'class="IdClass">(.*?)</td>(.*?)class="someClass">(.*?)</td>(.*?)object(\d+?)';
    if Exec(RichEdit1.Text) then
    repeat
      RichEdit2.Lines.Add(Match[1] + ' - '  + Match[3] + ' - ' + Match[5]);
    until not ExecNext;
  finally
    Free;
  end;
end;


По идее должна выводить:
Код

Header1 - Description1 - 1
Header2 - Description2 - 2


Вообще не получается. Поправьте меня...

Добавлено: Всё получилось.  smile Работает, просто хотелось бы узнать как проще сделать?

Это сообщение отредактировал(а) Guide - 26.7.2008, 10:20
PM MAIL   Вверх
Guide
Дата 27.7.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При использовании кода для html страницы в 124.3 kb прогрмма зависает. Что можно сделать?
PM MAIL   Вверх
Alkash
Дата 28.7.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Код из рабочего проекта, думаю поможет разобраться 
Код

type
    TTrackInfo = record
        Name: String;
        Duration: Integer;
        DurationStr: String;
    end;

    TAlbumInfo = record
        Artist: String;
        Name: String;
        Tracks: array of TTrackInfo;
        SumDuration: String;
    end;
    PAlbumInfo = ^TAlbumInfo;
    AAlbumInfo = array of TAlbumInfo;
    PAAlbumInfo = ^AAlbumInfo;

*******
function ParseHTML(Text: String; Albums: PAAlbumInfo): Boolean;

    function ReadBlock: Boolean;
    var
        ind, l: Byte;
        alb: PAlbumInfo;
        i: Integer;
    begin
        try
            ind:= Length(Albums^);
            SetLength(Albums^, ind + 1);
            alb:= @Albums^[ind];
            i:= Pos('title="', Text);
            Delete(Text, 1, i + 6);
            i:= Pos('/', Text);
            alb.Artist:= Copy(Text, 1, i - 2);
            Delete(Text, 1, i);
            i:= Pos('"', Text);
            alb.Name:= Copy(Text, 2, i - 2);
            Delete(Text, 1, i);
            i:= Pos('<b>Tracks:</b>', Text);
            Delete(Text, 1, i + 14);
            i:= Pos('<br>', Text);
            SetLength(alb.Tracks, StrToInt(Copy(Text, 1, i - 1)));
            i:= Pos('<b>Total time:</b>', Text);
            Delete(Text, 1, i + 18);
            i:= Pos('<br>', Text);
            alb.SumDuration:= Copy(Text, 1, i - 1);
            for l:= 1 to Length(alb.Tracks) do
            begin
                i:= Pos('100%">', Text);
                Delete(Text, 1, i + 5);
                i:= Pos('</td>', Text);
                alb.Tracks[l - 1].Name:= Copy(Text, 1, i - 1);
                i:= Pos('wrap>', Text);
                Delete(Text, 1, i + 4);
                i:= Pos('</td>', Text);
                alb.Tracks[l - 1].DurationStr:= Copy(Text, 1, i - 1);
                alb.Tracks[l - 1].Duration:= DecodeTime(alb.Tracks[l - 1].DurationStr);
                Delete(Text, 1, i);
            end;
            Result:= True;
        except
            Result:= False;
        end;
    end;
var
    i: Integer;
begin
    i:= Pos('<a name="fdbsr"></a>', Text);
    Delete(Text, 1, i);
    while    (Pos('title="', Text) > 0) and ReadBlock do;
    Result:= (Pos('title="', Text) = 0);
end;





--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
VICTAR
Дата 28.7.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Кстати в скобках указывается то, что потом получится в Match[1], Match[2]  и т.д. Я так подозреваю, что не все данные которые ты заключил в скоки тебе нужны. Если так, то попробуй убрать не ненужные. Вдруг поможет..
PM MAIL   Вверх
Guide
Дата 29.7.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



VICTAR, а как убрать лишнее?
PM MAIL   Вверх
VICTAR
Дата 30.7.2008, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Просто убери скобки там, где они не нужны
Код

Expression := 'class="IdClass">(.*?)</td>.*?class="someClass">.*?</td>.*?object(\d+?)';

хотя не факт, что от этого прибавление в скорости
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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