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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2012, 07:24   #1
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию Копирование данных из кода

Здравствуйте, копирую я сведения с сайта и запихиваю их в элементы на форме, все получается, обращаюсь к тегу и его номеру, например:
Код:
ComboBox15.Text:=WebBrowser1.OleObject.Document.all.tags('h2').item(2).InnerText;
А заминка у меня с куском HTML:
Код:
		
<h2>Продажа, Квартира, ул.Абеля, д.29</h2>
<strong>Вид сделки:</strong> Продажа
<br/>
<strong>Вид недвижимости: </strong>Квартира
<br/>
Как мне обратиться к "продажа" и "квартира"? Какие теги там?
Списибо)
a_n_n_a вне форума Ответить с цитированием
Старый 05.03.2012, 09:27   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Зачем вам WebBrowser1, он медленно работает и грузит ненужное. Лучше воспользуйтесь IdHTTP1

Примерно так
для парсинга тэгов этот код нашел здесь на форуме
Код:
 {-------------------------------------------------------------------------------
    Функция: ParseStr
    Автор:    ArhangeL
    Дата:  2011.01.11
    Входные параметры: str, sub1, sub2: string
    Результат:    string
    Описание: Парсер строки, вытаскивает текст из строки str между тегами sub1, sub2
    Stt входная строка.
    sub1 - открывающий тег.
    Sub2 - закрывающий тег.
  -------------------------------------------------------------------------------}


function ParseStr(str, sub1, sub2: string): string;
var
  st, fin: Integer;
begin
  st := Pos(sub1, str);
  if st > 0 then
  begin
    str := Copy(str, st + length(sub1), length(str) - 1);
    st := 1;
    fin := Pos(sub2, str);
    Result := Copy(str, st, fin - st);
    str := Copy(str, fin + length(sub2), length(str) - 1);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
HTTPCode: String;
begin
получаем код страницы
HTTPCode:=IdHTTP1.Get('http://нужный хост');
//парсируем полученный код и получаем результат
//AnsiLowerCase нужно для перевода полученного кода в нижний регистр, 
//для того что на страничке могут быть ключевые слова в разном регистре и парсинг не сработает
ComboBox15.Text:=ParseStr(AnsiLowerCase(HTTPCode), '<h2>продажа, квартира', '</h2>');
end;
Напишите ссылку на ту страничку откуда хотите извлеч данные, может быть код придется доработать

Последний раз редактировалось Aliens_wolfs; 05.03.2012 в 09:54.
Aliens_wolfs вне форума Ответить с цитированием
Старый 05.03.2012, 10:29   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Выкиньте Indy...
вам не нужен комбаин для открытия бутылок пива...

используйте Synapce(THTTPSend)...
Человек_Борща вне форума Ответить с цитированием
Старый 05.03.2012, 12:19   #4
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

Вы меня неправильно поняли, сама проглядела косяк)
Короче, мне нужны "продажа" и "квартира" в этих тегах.
Код:
<strong>Вид сделки:</strong> Продажа
<br/>
<strong>Вид недвижимости: </strong>Квартира
<br/>
А во всяких IdHTTP1 и Synapce(THTTPSend) я не шарю.
Как именно при моих условиях туда подобраться?
a_n_n_a вне форума Ответить с цитированием
Старый 05.03.2012, 15:24   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
<strong>Вид сделки:</strong> Продажа
<br/>
<strong>Вид недвижимости: </strong>Квартира
<br/>
Этот HTML код можно обрабатывать построчно т.к. нужное значение за тэгом

Примерно так для вашего проекта
Код:
Function FindWebBrowser(sFind: string): string;
var 
  i, а: Integer; 
  S: String;
begin 
  for i := 0 to WebBrowser1.OleObject.Document.All.Length - 1 do 
  begin 
 //прокручиваем построчно полученный код
  S:=WebBrowser1.OleObject.Document.All.Item(i).InnerHTML;
 //Ищем нужное значение
    if Pos('<strong>'+AnsiLowerCase(sFind), AnsiLowerCase(S)) <> 0 then 
    begin 
   a:=pos('</strong>',s)+9;
   result:=Copy(s, a, maxint);//Результат
   break;
    end; 
  end;
end;

//Использовать так
procedure TForm1.Button2Click(Sender: TObject);
begin
ComboBox15.Text:=FindWebBrowser('Вид сделки'); // Получим Продажа
end;
А лучше напишите часть кода где этот тэг ловите, там можно будет кое что подправить и напишите адрес странички откуда берете эти данные, можно переделать под IdHTTP
Я бы посоветовал отказаться от WebBrowser, он медленный.

Последний раз редактировалось Aliens_wolfs; 05.03.2012 в 17:10.
Aliens_wolfs вне форума Ответить с цитированием
Старый 06.03.2012, 06:47   #6
a_n_n_a
Форумчанин
 
Регистрация: 06.03.2009
Сообщений: 157
По умолчанию

aliens_wolfs, что-то типо такой функции мне и надо)))
Сайт вот http://www.gorod-dv.ru/house/370.
Только функция совсем не выдает "продажа", там в результате весь код страницы...(((
a_n_n_a вне форума Ответить с цитированием
Старый 06.03.2012, 08:55   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Сейчас на странице попробуем. Еще вопрос вы через свою програмку смотрите и вам нужно чтобы при просмотре снимало нужную инфу я правильно понял

Вот код накидал работает проверил
Код:
//Удаление лишних символов
function Sha_SpaceCompressPChar(p: pchar): pchar;
var
  q: pchar;
  ch: char;
label
  rt;
begin
  ;
  Result := p;
  if (p <> nil) and (p^ <> #0) then
  begin
    ;
    q := p - 1;
    repeat;
      repeat;
        ch := p^;
        inc(p);
        if ch = #0 then
          goto rt;
      until ch > ' ';
      inc(q);
      repeat;
        q^ := ch;
        ch := p^;
        inc(q);
        inc(p);
      until ch <= ' ';
      q^ := ' ';
    until ch = #0;
    rt: if q < Result then
      inc(q);
    q^ := #0;
  end;
end;

//Моя функция для парсинга там же можно включить и удаление лишних символов
function GetPush(source, StrFirst, StrEnd: string; CompressChr: boolean=false):string;
var
a,b: integer;
s: string;
begin
Result:='';
a:=pos(AnsiLowerCase(StrFirst),AnsiLowerCase(source));
if a<>0 then
begin
a:=a+Length(StrFirst);
s:=copy(source, a, maxint);
if StrEnd <> '' then
b:= pos(AnsiLowerCase(StrEnd),AnsiLowerCase(s))
else
b:=MaxInt;
if b<>0 then
if CompressChr then
result:=Sha_SpaceCompressPChar(Pchar(copy(source, a, b-1)))
else
result:=Pchar(copy(source, a, b-1));
end;
end;

//Функция убирает тэги
function RemoveTags(const s: string): string;
var
 i: Integer;
 InTag: Boolean;
begin
 Result := '';
 InTag := False;
 for i := 1 to Length(s) do begin
   if s[i] = '<' then inTag := True
   else if s[i] = '>' then inTag := False
   else if not InTag then Result := Result + s[i];
 end;
end;

//Функция ищет нужные значения в коде полученном с WebBrowser
Function FindWebBrowser(WebBrowser: TWebBrowser; sFind: string): string;
begin
   sFind:='<strong>'+AnsiLowerCase(sFind);
   { задействуем функцию для парсинга и включаем в ней удаление лишних символов т.к. 
     есть лишние пробелы, удаляем тэги и выдадим результат }
   result:=RemoveTags(GetPush(WebBrowser.OleObject.Document.documentElement.innerHTML, sFind, '<br>', true));
end;

//Сделайте в WebBrowser1 событие OnDocumentComplete тогда значения автоматом загрузятся когда страничка полностью загружена
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
ComboBox15.Text:=FindWebBrowser(WebBrowser1, 'Вид сделки:');
ComboBox16.Text:=FindWebBrowser(WebBrowser1, 'Вид недвижимости:');
ComboBox17.Text:=FindWebBrowser(WebBrowser1, 'Город:');
ComboBox18.Text:=FindWebBrowser(WebBrowser1, 'Район:');
ComboBox19.Text:=FindWebBrowser(WebBrowser1, 'Адрес:');
ComboBox20.Text:=FindWebBrowser(WebBrowser1, 'Цена:');
Memo1.text:=FindWebBrowser(WebBrowser1, '<br>Описание:<br>');
end;

Последний раз редактировалось Aliens_wolfs; 06.03.2012 в 15:09.
Aliens_wolfs вне форума Ответить с цитированием
Старый 12.03.2012, 18:36   #8
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Парсеры юзать конечно круто но лучше юзать DOM модель. там прям как в яваскрипте можно дергать со страницы что хочешь
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование хэша из исходного кода eFail Работа с сетью в Delphi 3 19.08.2010 16:45
Копирование кода большое кол-во раз, но с изменяющимеся номерами компонентов arhiepiskop Общие вопросы Delphi 7 10.06.2010 08:58
Копирование данных Alex___ Microsoft Office Excel 3 16.10.2009 14:34
копирование кода из исходников cowboy Общие вопросы Delphi 4 15.07.2009 17:24
Копирование строки кода artemavd Общие вопросы Delphi 6 27.03.2009 15:38