Делаю парсинг хтмл странички через IdHTTP. Страничка закодирована в чарсете CP(WINDOWS)-1251 После парсинга делаю вывод всего что добыл в мемо. И тут возникает проблемка. Мне всё выводит в чарсте CP(WINDOWS)-1252! И поэтому я вижу вот такие вот кракозябры Ïîñòåëüíûå ïðèíàäëåæíîñòè вместо русского текста. =( Воарос - как сделать вывод в CP(WINDOWS)-1251 или преобразовать CP(WINDOWS)-1252 в CP(WINDOWS)-1251
Есть 2 варианта. 1.Использовать TWebBrowser с параметром visible:=false; тогда можно будет получить исходный код. 2.Подключиться к серверу сокетами и получить хтмл. Код печатаю,потом добавлю сюда. Вариант 1 代码: [/b] [b]Uses ActiveX; [/b] [b]...[/b][b] function GetHTML(WebBrowser: TWebBrowser; ACode: TStrings): Boolean; var ps: IPersistStreamInit; ss: TStringStream; sa: IStream; s: string; begin ps := WebBrowser.Document as IPersistStreamInit; s := ''; ss := TStringStream.Create(s); try sa := TStreamAdapter.Create(ss, soReference) as IStream; Result := Succeeded(ps.Save(sa, True)); if Result then ACode.Add(ss.Datastring); finally ss.Free; end; end; [/b] </b><p><b>[b] Функция для получения html кода из tWebBrowser. Использование:пишем в каком либо обработчике GetHTML($Имя компонента tWebBrowser,Массив строк *(обычно Memo1 или другое название компонента.)*); *Примечание для работы функи нужен tWebBrowser на форме,если не хочешь чтобы его было видно выставляем у него свойство Visible в false. Вариант 2 代码: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw,ActiveX,ScktComp; type THtmlRequest = class(TThread) private FUrl: string; html: string; protected procedure Execute; override; public constructor Create(url: string); procedure Sync; end; var Form46: TForm46; implementation {$R *.dfm} constructor THtmlRequest.Create(url: string); begin inherited Create(true); FUrl := url; Resume; end; procedure THtmlRequest.Execute; var sock: TClientSocket; s: string; i: integer; begin sock := TClientSocket.Create(nil); sock.ClientType := ctBlocking; sock.Port := 80; i := Pos('://', FUrl); if i > 0 then s := Copy(FUrl, i+3, Length(FUrl)) else s := FUrl; i := Pos('/', s); if i > 0 then s := Copy(s, 1, i-1) else s := FUrl; sock.Host := s; try sock.Active := true; s := 'GET ' + FUrl + ' HTTP/1.0' + #10 + 'Accept: text/html' + #10 + //'Referer: ' + FUrl + #10 + 'Accept-Language: ru_RU,ru' + #10#10; sock.Socket.SendText(s); html := ''; i := 0; repeat try s := sock.Socket.ReceiveText; except Break; end; if s = '' then Inc(i) else begin html := html + s; i := 0; end; until i = 1024; except html := 'Connection error'; end; Synchronize(Sync); sock.Free; Terminate; end; procedure THtmlRequest.Sync; begin Form46.Memo1.Text := html; end; Автор кода 2 варианта не я Этот вариант более сложен в понимании.Для работы на форме нужно разместить на форме компонент Memo,заменить Form46 везде на имя своей формы,создать обработчик событий и в нём написать " THtmlRequest.Create('http://www.google.com/');" Как ты понял параметр это адрес страницы.
1.Размещаешь на форме (окошке таком хД) компонент twebbrowser (найти можно в поиске компилятора). 2.Размещаешь на форме кнопку,жмёшь по ней 2 раза и ты попадаешь в редактор кода. 3.В том месте куда тебе показал компилятор пиши:twebbrowser.navigate('адрес страницы'); 4.В этом же месте но немного ниже пиши:gethtml(webbrowser1,memo1.text); 5.Компилируй. //UPD Тупанул,в 3 шаге не twebbrowser а webbrowser1 .
Всё кроме этого знал(чесна ) ещё раз пасиб. Ну и продолжим трахать твой мозг... как сделать через Twebbrowser сделать отправку данный в POST иными словами авторизоваться где либо (:
Через веб броузер такое не прокатит.Используй idhttp.post. Использование: 代码: var post:tstringlist;//объявляем переменную массив строк. procedure TForm47.Button1Click(Sender: TObject); begin post.Create(); //Создаём массив строк. post.Add('login=1');//Добавляем в массив запрос,в нём переменной login на html странице будет присвоена еденица. //в post можно добавлять любое число строк(ну не совсем любое но достаточно большое) idhttp1.Post('URL куда отправляем запрос',post); {в 1 параметре адрес куда отправляем запрос, 2 параметр наш массив строк 'post' * Примечание:результат выполнения этой функции можно присвоить переменной чтобы получить ответ Например:otvet:=idhttp1.Post('URL куда отправляем запрос',post)} end; Данный код копипастой работать не будет,создавай обработчик и пихай в него то что в моём. Всё описание в коментах gethtml(webbrowser1,memo1.text); что ругает ?текст ошибки полный давай.
Это я знаю. Уже осуществил с сохранением кукисов и тд.. НО как их тогда связать?. Авторизуюсь через idhttp но браузеру как то по**ть на это.
Вот что выдала программа при попытки парсинга. 代码: First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 004B7021 in module 'Project3.exe'. Read of address 00000000'. Process Project3.exe (2680) Сама программа 代码: unit Parser; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdCookieManager, OleCtrls, SHDocVw, ActiveX; type TForm3 = class(TForm) IdHTTP1: TIdHTTP; IdAntiFreeze1: TIdAntiFreeze; Button1: TButton; Memo1: TMemo; IdHTTP2: TIdHTTP; Memo2: TMemo; IdCookieManager1: TIdCookieManager; WebBrowser1: TWebBrowser; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; ps: IPersistStreamInit; ss: TStringStream; sa: IStream; s: string; implementation {$R *.dfm} function GetHTML(WebBrowser: TWebBrowser; ACode: TStrings): Boolean; begin ps := WebBrowser.Document as IPersistStreamInit; s := ''; ss := TStringStream.Create(s); try sa := TStreamAdapter.Create(ss, soReference) as IStream; Result := Succeeded(ps.Save(sa, True)); if Result then ACode.Add(ss.Datastring); finally ss.Free; end; end; procedure TForm3.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://'+Edit1.Text); gethtml(webbrowser1,memo1.lines); end; end.
GOOGLE SEARCHER LVL UP! Смог перекодировать страничку чтоб видеть русс текст! Уря товарисчи! Маза, сори за напрасный трах мозга, но всё равно спс за помощь(узнал как работают функции) + Вот собстно код который меня спас (: 代码: function RussianToUnicode(S: String): String; var Wrd:Word; pW,pR:PWord; len:Integer; begin pW:=@S[1]; len:=Length(S); SetLength(Result,len); pR:=@Result[1]; while Len<>0 do begin Wrd:=pW^; case Wrd of $C0..$DF,$E0..$FF:pR^:=Wrd+$0350; else pR^:=Wrd; end; inc(pW); inc(pR); dec(Len); end; end;