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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2016, 22:02   #1
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию Переписать функцию

Код:
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,RegExpr,Urlmon, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    function duble(const line: string):boolean;
    procedure pars(url:string);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  host:string; q:integer;
implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var str:string;
begin
str:=edit1.text;
if str[length(str)]='/' then
setlength(str,length(str)-1);
host:=str;
pars(edit1.text);
end;

function TForm1.duble(const line: string):boolean;
var i:integer;
begin
for i:=0 to memo1.Lines.Count-1 do
  if memo1.Lines[i]= line then begin
  result:=true; break; end else result:=false;
end;

procedure TForm1.pars(url: string);
var list:Tstringlist;
reg:TRegExpr;
begin
inc(q);
URLDownloadToFile(nil,Pchar(url),pchar('index'+inttostr(q)+'.html'),0,nil);
list:=Tstringlist.Create;
reg:=TRegExpr.Create;
if FileExists('index'+inttostr(q)+'.html') then
list.LoadFromFile('index'+inttostr(q)+'.html') else exit;

reg.Expression:='[a][\s]{1,}(href=")([^"]+)';
if reg.Exec(list.Text) then
Repeat
  if (reg.Match[2]<>'#')and(not duble(reg.Match[2])) then begin
  memo1.Lines.Add(reg.Match[2]);
  Application.ProcessMessages;
  label1.Caption:=inttostr(memo1.Lines.Count+1);
      if reg.Match[2][1]='/' then
          pars(host+reg.Match[2])
      else if copy(reg.Match[2],1,4)='http' then
          pars(reg.Match[2])
      else
          pars(host+'/'+reg.Match[2]);
      end;
 Until not reg.ExecNext else ShowMessage('Г*ГҐГ*');

//DeleteFile('index'+inttostr(q)+'.html');
list.Free;
reg.Free;

end;
initialization
q:=0;
end.
Все работает,только вот допустим собираю ссылки с одного сайта(собрал),потом пишу другой он собирает и с первого и со второго сайта.Т.е напишу третий будет собирать и с первого и со второго и третьего.В чем проблема?
brownb вне форума Ответить с цитированием
Старый 20.10.2016, 23:42   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

А чистить Мемо перед заданием следующего сайта Пушкин будет?
kropotkina-alice вне форума Ответить с цитированием
Старый 21.10.2016, 10:35   #3
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
А чистить Мемо перед заданием следующего сайта Пушкин будет?
Можно еще вопрос?)))Как сделать чтоб она ссылки из "вне" не парсила? а то там и маил ру начинает сканить и тд
brownb вне форума Ответить с цитированием
Старый 21.10.2016, 12:12   #4
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Определите критерий отбора ссылок.
Если вы хотите собирать только "родные" ссылки, то производите сравнение полученной ссылки с адресом сайта и берите только те, которые начинаются с заданного вами домена...
kropotkina-alice вне форума Ответить с цитированием
Старый 21.10.2016, 14:03   #5
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Определите критерий отбора ссылок.
Если вы хотите собирать только "родные" ссылки, то производите сравнение полученной ссылки с адресом сайта и берите только те, которые начинаются с заданного вами домена...
А можно кодом?)
brownb вне форума Ответить с цитированием
Старый 21.10.2016, 15:04   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Ну, вообще-то у вас и так анализируются хосты, в обязательном порядке включающие вашу переменную host.
Так что я что-то не понимаю, как у вас могут попадать в результаты такие адреса, как mail.ru...
Хотя... если только вот тут:
Код:
else if copy(reg.Match[2],1,4)='http' then
          pars(reg.Match[2])
Тогда измените на что-то вроде:
Код:
else if ((copy(reg.Match[2],1,4)='http') and (Pos(host, reg.Match[2])>0)) then
          pars(reg.Match[2])
kropotkina-alice вне форума Ответить с цитированием
Старый 21.10.2016, 15:39   #7
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

Цитата:
Сообщение от kropotkina-alice Посмотреть сообщение
Ну, вообще-то у вас и так анализируются хосты, в обязательном порядке включающие вашу переменную host.
Так что я что-то не понимаю, как у вас могут попадать в результаты такие адреса, как mail.ru...
Хотя... если только вот тут:
Код:
else if copy(reg.Match[2],1,4)='http' then
          pars(reg.Match[2])
Тогда измените на что-то вроде:
Код:
else if ((copy(reg.Match[2],1,4)='http') and (Pos(host, reg.Match[2])>0)) then
          pars(reg.Match[2])
[dcc32 Error] Unit1.pas(68): E2251 Ambiguous overloaded call to 'Pos'
System.pas(30215): Related method: function Pos(const WideString; const WideString; Integer): Integer;
System.pas(30055): Related method: function Pos(const string; const string; Integer): Integer;
brownb вне форума Ответить с цитированием
Старый 23.10.2016, 16:23   #8
brownb
Форумчанин
 
Регистрация: 16.10.2016
Сообщений: 157
По умолчанию

помогите плз
brownb вне форума Ответить с цитированием
Старый 24.10.2016, 15:50   #9
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Какую версию Delphi используете ?
Просто эта ваша ошибка компиляции возникла из-за этого ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 24.10.2016, 16:02   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В pos еще 3-ий параметр есть в современном делфи
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать функцию «Факториал» и программу, использующую эту функцию для вывода таблицы факториалов. Rufer Помощь студентам 1 20.06.2016 12:53
Как переписать функцию на питоне в С# pdesyatnyk Помощь студентам 3 21.12.2015 18:11
Что за функция (помогите опознать функцию или переписать) flesyyykkk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 17.01.2014 17:04
[Delphi]Переписать программу использовав функцию just4smth Помощь студентам 4 16.10.2011 08:45