Автор Тема: HTML в TXT  (Прочитано 4504 раз)

Оффлайн Alex_K

  • Ученик
  • **
  • Сообщений: 68
  • Репутация: 26
    • www.koscheev.ru
HTML в TXT
« Ответ #15 : 15 Июль 2006, 23:42:33 »
Цитировать
Вобщем так, есть такая задача: нужно из html выдрать весь "полезный текст", т.е. тот, который виден в окне браузера. Сначала я делал так: включал в выходной файл все, что находится между символами ">" и "<". Но в ходе тестирования оказалось что эти симолы могут быть и в "полезном" тексте, например:

<font color="#000099">To uninstall a earlier version, run the Corel Uninstall program from <b>Start > Programs > CorelDRAW > Setup and notes</b> (or <b>Start > Settings > Control panel > Add/remove programs</b> and select <b>Corel Applications</b> from the Install/Uninstall tab).</font>

Вот... какие у вас есть идеи по этому поводу?

Вообще-то знаки [<>] в "полезном" тексте недопустимы, поэтому вариант вырезания тегов с помощью простеньких регулярных выражений сработает.

Оффлайн Mozgorep

  • Старшеклассник
  • ***
  • Сообщений: 128
  • Репутация: 2
HTML в TXT
« Ответ #16 : 16 Июль 2006, 09:41:58 »
Цитировать
Вообще-то знаки [<>] в "полезном" тексте недопустимы
Я тоже сначала так думал, но потом оказалось, что не все так просто. Приведенный фрагмент на экране выглядит так:
To uninstall a earlier version, run the Corel Uninstall program from Start > Programs > CorelDRAW > Setup and notes (or Start > Settings > Control panel > Add/remove programs and select Corel Applications from the Install/Uninstall tab)
Попробуйте сами, если не верите :). В ходе экспериментов выяснилось, что текст между знаками <  > браузеры считают тегом, если он написан сразу после знака <, т.е. <b> - это тег, а < b> - уже нет. Так что это уже не проблема :)
Зато есть вопрос. Оказывается есть такие теги, текст между которыми не является "полезным", например, <STYLE>  </STYLE>. Есть ли еще подобные теги?

Оффлайн Alex_K

  • Ученик
  • **
  • Сообщений: 68
  • Репутация: 26
    • www.koscheev.ru
HTML в TXT
« Ответ #17 : 18 Июль 2006, 23:35:05 »
Цитировать
Я тоже сначала так думал, но потом оказалось, что не все так просто. Приведенный фрагмент на экране выглядит так:
To uninstall a earlier version, run the Corel Uninstall program from Start > Programs > CorelDRAW > Setup and notes (or Start > Settings > Control panel > Add/remove programs and select Corel Applications from the Install/Uninstall tab)
Попробуйте сами, если не верите . В ходе экспериментов выяснилось, что текст между знаками <  > браузеры считают тегом, если он написан сразу после знака <, т.е. <b> - это тег, а < b> - уже нет. Так что это уже не проблема
Зато есть вопрос. Оказывается есть такие теги, текст между которыми не является "полезным", например, <STYLE>  </STYLE>. Есть ли еще подобные теги?

Я  к тому, что то, что отображается в браузере знаками больше или меньше должно быть безопасной HTML-последовательностью, т.е. &lt; и &gt;
Как отображает браузер теги с установленным пробелом внутри после знака меньше - это его личное дело (и его разработчиков конечно, же), он в праве вообще не показывать всё, что заключено между знаками <>.

Тег STYLE допустим согласно спецификации толко внутри HEAD. Соответственно "полезный" текст будет находится ТОЛЬКО внутри тега BODY. Наличие внутри BODY тегов STYLE и правильная их инетрпертация бразуером, еще не гвоорит о том, что HTML правильный.

Оффлайн GogA

  • Автор
  • Студент
  • *****
  • Сообщений: 564
  • Репутация: 22
  • root :)
    • gogolev.net
HTML в TXT
« Ответ #18 : 19 Июль 2006, 02:10:52 »
<img src="px.gif" alt="parent > child" style="width: 1px; height.gif" />

:D

вообще код не верный :) так как w3c рекомендует все < > внутри тегов заменять на &lt; и &gt

но такие примеры встречаются :)


кстати, по результатам работы скрипта из второго сообщения
после:
Цитировать
<font color="#000099">To uninstall a earlier version, run the Corel Uninstall program from <b>Start > Programs > CorelDRAW > Setup and notes</b> (or <b>Start > Settings > Control panel > Add/remove programs</b> and select <b>Corel Applications</b> from the Install/Uninstall tab).</font>

выдаёт:
Цитировать
To uninstall a earlier version, run the Corel Uninstall program from Start > Programs > CorelDRAW > Setup and notes (or Start > Settings > Control panel > Add/remove programs and select Corel Applications from the Install/Uninstall tab).

хотя для <img src="px.gif" alt="parent > child" style="width: 1px; height.gif" /> видать нужны более серьёзные регулярные выражения.. да и не факт что регулярные справятся :)

Оффлайн GogA

  • Автор
  • Студент
  • *****
  • Сообщений: 564
  • Репутация: 22
  • root :)
    • gogolev.net
Re: HTML в TXT
« Ответ #19 : 19 Июль 2006, 02:24:35 »
2 Mozgorep:
вот ещё парочка :)
<script *> </script>
<object *> </object>

не забудь про всякие комментарии <!-- -->... вроде это не единственный

Оффлайн Mozgorep

  • Старшеклассник
  • ***
  • Сообщений: 128
  • Репутация: 2
HTML в TXT
« Ответ #20 : 22 Июль 2006, 17:06:42 »
привожу 2 варианта решения, вдруг кому понадобится :)
Вариант первый, с использованием трудов ребят из MS
function Html2Txt(S:PChar; var len:integer):boolean;
var
  Doc: DispHTMLDocument;
  str:string;
begin

result:=true;
try
      SetString(str,S,len);
      Doc:=CoHTMLDocument.Create;
      OleVariant(Doc).write(str);
      str:=(Doc as IHtmlDocument2).body.innerText;
      len:=length(str);
      StrPCopy(S,str);
except
    result:=false;
end;

end;
Вариант второй, без использования трудов ребят из MS :)
function Clean(S: PChar; var len:integer): boolean;
var
  tag, tagI, ExecTag: boolean;
  i,t,TagBegin,dlina: integer;
  temp:string[6];
  ch:Byte;
begin
  result:=true;
try
  temp:='ABCDEF';
  dlina:=-1; TagBegin:=0;
  tag:=false;
  tagI:=false;
  ExecTag:=false;
  dec(len);
  for i:=0 to len do begin
    case S[i] of
      '<':  case S[i+1] of
                'A'..'Z',
                'a'..'z',
                '!', '%',
                '/', '?': begin
                            tag:=true;
                            TagBegin:=i;
                            if S[i+1]='/' then inc(TagBegin);
                            continue;
                          end;
              end;
      '&':  if ((not tag)and (not ExecTag)) then
              case S[i+1] of
                'A'..'Z',
                'a'..'z',
                '0'..'9',
                '#': begin
                       tagI:=true;
                       continue;
                     end;
              end;
      ';',' ':  if ((not tag) and tagI and (not ExecTag)) then
                  begin
                    tagI:=false;
                    continue;
                  end;
      '>':  begin
              if tag then begin
                tag:=false;

                for t:=1 to 6 do
                  begin
                    temp[t]:=S[TagBegin+t];
                    ch:=ord(temp[t]);
                    if ((ch>$40)and(ch<$61)) then temp[t]:=chr(ch+$20);
                  end;
               
                if ( (Pos('style',temp)=1) or
                     (Pos('script',temp)=1) or
                     (Pos('object',temp)=1) ) then
                  ExecTag:=not ExecTag;
                 
                continue;
              end;
            end;
    end;

    if ((not tag) and (not tagI) and (not ExecTag)) then
      begin
        inc(dlina);
        S[dlina]:=S[i];
      end;

  end;
  len:=dlina+1;
  S[len]:=#0;
except
  result:=false;
end;

end;