Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2010, 23:37   #1
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию Парсинг страницы с кривой кодировкой

Не получается никак распарсить, нужна помощь. В едит указываем ссыылку, по ней парсим линки в мемо1, с мемо1 берем линк, заходим на страницу и распарсиваем номер, ложим в мемо2 и так циклом. Номер не распарсивается потмоу что русский текст не может найти в коде страницы, т.к. кодировка кривая. UTFEncode, UTFDecode не помогли

Код:
unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,

  IdHTTP, IdAntiFreezeBase, IdAntiFreeze;



type

  TForm1 = class(TForm)

    IdHTTP1: TIdHTTP;

    Button1: TButton;

    Memo1: TMemo;

    Edit1: TEdit;

    Button2: TButton;

    Memo2: TMemo;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);

var

  i:integer;

  page:string;

  load:string;

  url:string;

  ps:integer;

begin



      for i:=1 to 1000 do begin

        page:=IntToStr(i);

        load:=IdHTTP1.Get(''+Edit1.Text+'-p-'+page+'');

        load:=IdHTTP1.Get(Edit1.Text);

        ps:=Pos('>Следующая</a></div>',load);

        if ps=0 then

          begin

            break;

          end;

            while Pos(''+#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32+'<a href="',load) <> 0 do begin

              load:=copy(load,pos(''+#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32#32+'<a href="',load)+33,length(load));

              url:= copy(load,0,pos('"',load)-1);

              Memo1.Lines.Add(url);

            end;

    end;

    end;



procedure TForm1.Button2Click(Sender: TObject);

var

i:integer;

num:string;

load:string;

begin



for i:=0 to Memo1.Lines.Count do begin



load:=IdHTTP1.Get(Memo1.Lines[i]);

load:=AnsiToUTF8(load);



while Pos(':'+#32+'<strong>',load) <> 0 do begin

load:=copy(load,pos('<li>телефон:'+#32+'<strong>',load)+23,length(load));

              num:=copy(load,0,pos('</strong></li>',load)-1);

              Memo2.Lines.Add(num);

end;





end;





  end;

end.
gamer123 вне форума Ответить с цитированием
Старый 19.09.2010, 01:44   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а зачем вам парсить всю эту кривизну?
ищите значащие данные, без ложных пробелов(32 вроде он)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 02:15   #3
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем вам парсить всю эту кривизну?
ищите значащие данные, без ложных пробелов(32 вроде он)
посмотрите код страницы. там иначе никак не получица. только с кривизной. или если использовать только тэги. то будет очень много мусора
gamer123 вне форума Ответить с цитированием
Старый 19.09.2010, 02:26   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какой страницы?
и что надо вытянуть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 04:44   #5
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
какой страницы?
и что надо вытянуть?
вторая кнопка. заходит на сфтраницы типа http://moscow.olx.ru/nokia-e66-iid-122046090 и дергает то что между тэгами <li>телефон: <strong> и </strong></li>, но т.к. кодировка страницы кривая, pos не может найти слово на русском
gamer123 вне форума Ответить с цитированием
Старый 19.09.2010, 12:42   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да уж, это не кодировка кривая, а...

страница скорее всего в UTF8 кодирована, а не в ANSI, раскодируйте и ищите на здоровье(<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, и не скорее всего, а точно)

в итог я так и не понял в чем кривизна кодировки, просто помните что кодировок много.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.09.2010, 14:52   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Если язык не русский - то он кривой! Английский - кривой! Японский - кривой!

Если кодировка не Win1251 - то она кривая! UTF8 - кривая! KOI8-R - кривая!

А руки у меня не кривые, неее...
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.09.2010, 14:53   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вникать.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.09.2010, 15:13   #9
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да уж, это не кодировка кривая, а...

страница скорее всего в UTF8 кодирована, а не в ANSI, раскодируйте и ищите на здоровье(<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />, и не скорее всего, а точно)

в итог я так и не понял в чем кривизна кодировки, просто помните что кодировок много.
страница в ютф8 да. если я правильно понял, то инди по дефллту качает ее в ansi? это в utf кодировать надо? или можно в инди указать сразу, чтобы забирало в utf8?
gamer123 вне форума Ответить с цитированием
Старый 19.09.2010, 15:17   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ИнДи качает её так как отдает сервер.
используйте UTF8ToANSI(например)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг XML страницы record222 Общие вопросы Delphi 3 06.04.2010 18:07
Парсинг голой HTML страницы Blourid Работа с сетью в Delphi 5 15.03.2010 19:37
Парсинг страницы Terikon Общие вопросы Delphi 3 04.04.2009 00:32
парсинг страницы seoanalyzer Общие вопросы Delphi 3 13.02.2009 12:50
Парсинг HTML страницы OkeaH Работа с сетью в Delphi 1 19.01.2009 09:17