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

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

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

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

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

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

Добрый вечер. Делаю парсер с многими функциями и застопорился на нескольких моментах. Использовал компонент IEParser, документации ненашел. Прошу помощи. Суть программы пока что - вбиваем в едит запрос, и по этому запросу парсит гугл и выводит напарсенное в мемо. Тут возникло 2 вопроса.
1. При старте проги ошибка undeclared identifier 'Go', ругается на строчку IEParser1.Go;
2. Данный код позволяет парсить только 100 результатов выдачи, не до конца понял, как сделать чтобы парсило все (там вроде не больше 10000). По моему через цикл както...

Код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, IEParser;

type
  TForm1 = class(TForm)
    IEParser1: TIEParser;
    Memo1: TMemo;
    Edit1: TEdit;
    StatusBar1: TStatusBar;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure IEParser1Anchor(Sender: TObject; hRef, Target, Rel, Rev, Urn,
      Methods, Name, Host, HostName, PathName, Port, Protocol, Search,
      Hash, AccessKey, ProtocolLong, MimeType, NameProp: String;
      Element: TElementInfo);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IEParser1.URL:='http://www.google.com/ie?q='+Edit1.Text+'&num=100&hl=en&lr=&newwindow=1&c2coff=1';
IEParser1.Go;
end;

procedure TForm1.IEParser1Anchor(Sender: TObject; hRef, Target, Rel, Rev,
  Urn, Methods, Name, Host, HostName, PathName, Port, Protocol, Search,
  Hash, AccessKey, ProtocolLong, MimeType, NameProp: String;
  Element: TElementInfo);
begin
if Pos('google', href) = 0 then Memo1.Lines.Add(href);
StatusBar1.SimpleText:='Find links: '+IntToStr(Memo1.Lines.Count+1);
end;

end.
Тогда хрен с этим компонентом, посоветуйте пожалуйста что нибуть более адекватное для достижения моей цели

Последний раз редактировалось Stilet; 03.08.2010 в 08:31.
gamer123 вне форума Ответить с цитированием
Старый 31.07.2010, 20:48   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Pos,PosEx,Copy
сойдет?))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.07.2010, 22:16   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... Не слышал об таком компоненте...
Дополню - получать текст страницы через IdHTTP.Get() - из вкладки Indy Clients (на иконке глобус такой синеватый)...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 01.08.2010, 03:15   #4
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Хм... Не слышал об таком компоненте...
Дополню - получать текст страницы через IdHTTP.Get() - из вкладки Indy Clients (на иконке глобус такой синеватый)...
спасибо сам пытался седня с помощью indy сделать. делфи 7. ккойто уг-сайт открывается норм а гугл и другие подобные сайты не хочет - выбивает программы ошибка exconverterror, пишут что изза устаревшей версии инди в делфи 7, пытался обновить, запарол д7 и забил на это качаю 2010 версию. как думаете в ней не должно быть проблем?

И снова таки добрый вечер) Хочется все таки доделать до конца. Скачал таки делфи 2010, 2 дня не хотеола вставать на хр, на висте только завелась..ну да ладно. Вобщем теперь сам разбираюсь в своем коде...

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
a:string;
begin
s:=IdHTTP1.Get('http://www.google.com/search?q=123');
a:=Copy(s, pos('<a href="',s)+9, pos('" class',s)-pos('<a href="',s)-9);
Memo1.Lines.Add(a);
end;

end.
пока что минимум функций, есть сложность в несккольких вопросах. Во первых, переменная s подозреваю должна быть массивом? Второе - это чтото нетак написал при парсинге..кусок дергает непонятно что там. Ссылки которые нужно парсить выглядят в выдаче гугла так - <a href="http://www.123greetings.com/" class=l><em>123</em> Greetings</a>, само собой, нужно чтобы выдергивало http://www.123greetings.com/. 10 ссылок на странице. Подскажите как организовать цикл для парсинга всех 10 ссылок со страницы

Последний раз редактировалось Stilet; 03.08.2010 в 08:33.
gamer123 вне форума Ответить с цитированием
Старый 03.08.2010, 01:15   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
строка это массив символов
второе см мой пост.
имею ввиду нужен двумерный массив, чтобы в мемо разместить ссылки столбиком?
gamer123 вне форума Ответить с цитированием
Старый 03.08.2010, 01:30   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Lines.Add добавляет строку каждый раз как вызывается(вызовите 10 раз, будет 10 строк)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.08.2010, 01:40   #8
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

a:=Copy(s,PosEx('>',s,Pos('<a href=',s))+1,PosEx('class',s,PosEx( '>',s,Pos('<a href=',s)-1))-PosEx('>',s,Pos('<a href=',s))-1); правильно будет? только почемуто PosEx пишет undeclared identifier. По поводу Lines.Add - логично. А как сделать чтобы каждую ссылку забил в мемо? В данном коде 1ю ссылку впишет и все

все проблемы решил. осталась теперь проблема чтобы после того как спармил 10 линков перелистывал страницу. страниц всего 1000 максимум, но в действительности может быть меньше и если это не учесть то может быть плохо )

выглядит таким образом:

http://www.google.com/search?hl=en&q=ЗАПРОС&start=0

после того как спарсили значение 0 меняем на 1, спарсили, на 2..и так поехали до 1000. с учетом того что может 1000 и не быть.

Пытался делать таким образом

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s:string;
a:string;
begin
for i:=0 to 1000 do begin
s:=IdHTTP1.Get('http://www.google.com/search?hl=en&q=ЗАПРОС&start='+i+'');
a:=Copy(s, pos('<a href="',s)+9, pos('" class',s)-pos('<a href="',s)-9);
Memo1.Lines.Add(a);
end;
end;

end.
Но ругается на i - несооствествие типов string и integer. В принципе логично. Но как сделать чтобы листало страницы

Последний раз редактировалось Stilet; 03.08.2010 в 15:34.
gamer123 вне форума Ответить с цитированием
Старый 03.08.2010, 15:28   #9
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

Цитата:
Но ругается на i - несооствествие типов string и integer.
http://www.delphibasics.ru/StrToInt.php
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 03.08.2010, 16:13   #10
gamer123
Пользователь
 
Регистрация: 19.01.2008
Сообщений: 92
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
сделал, но страницы не листает. парсит 10 раз одно и тоже

Код:
procedure TForm1.ParseClick(Sender: TObject);
var
  i:integer;
  a:string;
  s:string;
  urls:string;
begin
for i:= 0 to 10 do begin
a:=IntToStr(i);
  s:=IdHTTP1.Get('http://www.google.'+Zone.Text+'/search?hl=en&q='+Keyword.Text+'&start='+a+'');
  while pos('<h3 class="r"><a href',s) <> 0 do begin
    s := copy(s,pos('<h3 class="r"><a href=',s)+23,length(s));
    urls:= copy(s,0,pos('class',s)-3);
    Memo1.Lines.Add(urls);
    s:=copy(s,pos('">',s),length(s));
  end;  //цикл
  end;
end;
end.

Последний раз редактировалось AlDelta; 04.08.2010 в 02:08.
gamer123 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Универсальный Инсталятор скриптами и Delphi Jenya Свободное общение 4 14.10.2009 15:21
Delphi и АСМ. универсальный запуск Пепел Феникса Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 22.09.2009 20:18
Подскажите универсальный код для всплывающего окна SunnyDay JavaScript, Ajax 3 11.07.2009 23:22
Универсальный стилизатор исходного кода Eldarion Помощь студентам 3 26.04.2009 19:02
Как создать универсальный шаблон документа? CoolMan Microsoft Office Word 1 18.12.2007 09:10