1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Парсинг windows-1251

Тема в разделе 'Delphi', создана пользователем Kenpachi™, 14 дек 2010.

  1. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Делаю парсинг хтмл странички через IdHTTP.
    Страничка закодирована в чарсете CP(WINDOWS)-1251
    После парсинга делаю вывод всего что добыл в мемо.

    И тут возникает проблемка. Мне всё выводит в чарсте CP(WINDOWS)-1252! И поэтому я вижу вот такие вот кракозябры
    Ïîñòåëüíûå ïðèíàäëåæíîñòè вместо русского текста. =(

    Воарос - как сделать вывод в CP(WINDOWS)-1251 или преобразовать CP(WINDOWS)-1252 в CP(WINDOWS)-1251
  2. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
  3. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
  4. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    Точно не знаю ибо много с idhttp не работал но попробуй параметр request->CharSet в object inspector
    1 человеку нравится это.
  5. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Предложи любой другой метод парсинга. Только с кодом, т.к только начал учит Делфи.
  6. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    Есть 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 варианта не я  :D

    Этот вариант более сложен в понимании.Для работы на форме нужно разместить на форме компонент Memo,заменить Form46 везде на имя своей формы,создать обработчик событий и в нём написать " THtmlRequest.Create('http://www.google.com/');" 


    Как ты понял параметр это адрес страницы.






    1 человеку нравится это.
  7. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Пасиба! Жду =)
  8. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
  9. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Это пожалуйста тоже если не трудно разжевать =)
  10. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    1.Размещаешь на форме (окошке таком хД) компонент twebbrowser (найти можно в поиске компилятора).

    2.Размещаешь на форме кнопку,жмёшь по ней 2 раза и ты попадаешь в редактор кода.

    3.В том месте куда тебе показал компилятор пиши:twebbrowser.navigate('адрес страницы');

    4.В этом же месте но немного ниже пиши:gethtml(webbrowser1,memo1.text);

    5.Компилируй.

    //UPD Тупанул,в 3 шаге не twebbrowser а webbrowser1 .
  11. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Всё кроме этого знал(чесна :D ) ещё раз пасиб.

    Ну и продолжим трахать твой мозг... как сделать через Twebbrowser сделать отправку данный в POST иными словами авторизоваться где либо (:
  12. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    P/S Ругается на
    Код:
    ps: IPersistStreamInit;
    ss: TStringStream;
    sa: IStream;
  13. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Это исправил.
    теперь ругается вот на эту строку
    Код:
    gethtml(webbrowser1,memo1.text);
  14. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    Через веб броузер такое не прокатит.Используй 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);  что ругает ?текст ошибки полный давай.
    1 человеку нравится это.
  15. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Это я знаю. Уже осуществил с сохранением кукисов и тд.. НО как их тогда связать?. Авторизуюсь через idhttp но браузеру как то по**ть на это.
  16. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    [DCC Error] Parser.pas(61): E2010 Incompatible types: 'TStrings' and 'TCaption'
  17. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    Чорт,забыл что у .text тип String.Замени memo1.text на memo1.lines
  18. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    Вот что выдала программа при попытки парсинга.
    Код:
    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.
  19. TheMazzahaka Пользователи

    Сообщения:
    223
    Лайки:
    76
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    J-Games Dev
    Сейчас проверю.
  20. TopicStarter Overlay

    Kenpachi™ Who Crazy? Old school Пользователи Just a troll

    Сообщения:
    361
    Лайки:
    195
    Пол:
    Женский
    Репутация:
    0
    Команда:
    Solo
    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;
Черновик сохранён Черновик удалён

Поделиться этой страницей