[高分求救]提取网页中URL的源代码,并非简单提取 (300分)

  • 主题发起人 主题发起人 bedlang
  • 开始时间 开始时间
B

bedlang

Unregistered / Unconfirmed
GUEST, unregistred user!
我发现要把HTML所有html中的URL提取出来很麻烦。
请给源代码,可以贴在这,或发MAIL我:bedlang@yeah.net
谢谢[:)]
 
好你发个EMAIL给我确认一下
maochan@x263.net
不过效果不是太好,
能满足一般要求正改进中
 
TO:天真
我已发了。
 
已发效果不是太好
仅供借鉴发错了你等等
 
function TSearchThread.dealwith(url,baseurl:string):string; //处理网页路径
var i:integer;
beginpos:integer;
begin
URL:=stringreplace(url,'"','',[rfReplaceAll]);
if url[1]+url[2]+url[3]+url[4]+url[5]+url[6]+url[7]='http://' then
dealwith:=url;

URL:=stringreplace(url,'/','/',[rfReplaceAll]);

if pos(' ',url)<>0 then
begin
url:=copy(url,1, pos(' ',url)-1);
end;

for i:=length(baseurl) downto 1 do
begin
if baseurl='/' then
BEGIN
break;
END;
end;

IF I<>1 THEN
baseurl:=copy(baseurl,1,i)
ELSE
BASEURL:=BASEURL+'/';

if ((pos('.',url)<>0)and(pos('./',url)=0)and(url[1]<>'/')) or (pos('www.',url)<>0) then
dealwith:=url;

if (pos('../',url)=0)AND (POS('./',URL)=0) then //没有指定目录//??要改改
begin
if url[1]='/' then
url:=copy(url,2,length(url)-1);
dealwith:=baseurl+url;
end
else
begin
i:=length(baseurl)-1;
while pos('../',url)<>0 do
begin
beginpos:=pos('../',url);
delete(url,1,beginpos+2);
while i>=1 do
begin
if baseurl='/' then
begin
dec(i);
break;
end;
dec(i);
end;
end;
dealwith:=copy(baseurl,1,i)+'/'+url;
end;
dealwith:=url;
end;

function TSearchThread.getsrc(url:string):tstringlist;//普通网页
var strlist:tstringlist;
temp:string;
beginpos,endpos:integer;//取字符串的开始与结束
i:integer;
rightcount:integer;//符合的个数
resultlist:tstringlist;
query:tquery;
begin
if (form1.searchedlist.IndexOf(url)<>-1) then
exit;

form1.searchedlist.Add(url);

strlist:=tstringlist.Create ;
resultlist:=tstringlist.Create ;
temp:=getcontent(url);//得到该网页的内容
form1.Memo1.Lines.add(url);

//--------过滤网页是否符合条件
beginpos:=pos('<title>',temp);
endpos:=pos('</title>',temp);
if (copy(temp,beginpos+7,endpos-beginpos-6)='没有可以显示的页') or (copy(temp,beginpos+7,endpos-beginpos-6)='cannot find server page') then
exit;

if pos(cankao,url)<>0 then //保存内容到数据库
begin
form1.StatusBar1.Panels[1].text:=inttostr(strtoint(form1.StatusBar1.Panels[1].text)+1);
form1.memo2.Lines.add('insert');
savedata(url,temp);
end;

beginpos:=pos('href=',temp);

while beginpos<>0 do
begin
temp:=copy(temp,beginpos+5,length(temp)-beginpos-4);
endpos:=pos('>',temp);
if endpos>0 then
begin
strlist.Add(copy(temp,1,endpos-1));
delete(temp,1,endpos);
beginpos:=pos('href=',temp);
end
else
break;//说明此为非法内容
end;

//--------------处理URL

rightcount:=0;
for i:=0 to strlist.Count-1 do
begin
strlist.strings:=dealwith(strlist.strings,url);
if (form1.searchedlist.IndexOf(strlist.strings)=-1) then
//and(pos(cankao,strlist.strings)<>0)本来这个想加的,但有时会掩盖掉一些有用的东西
begin
resultlist.add(strlist.strings);
end;
end;
strlist.free;
result:=resultlist;
end;
贴出来了你自己看看!
不是太好!
呵给个参考吧
 
可以用webbroswer来做
首先 WebBrowser1.Navigate('www.delphibbs.com'); //浏览该html

uses mshtml_tlb;

var
selection: OLEVariant;
i, allcount: integer;
TagName: string;
begin
selection := (webbrowser1.document as ihtmldocument2).all;
allcount := selection.length;
For i := 0 To allcount - 1 do
begin

TagName := selection.Item(i).TagName;
If (TagName = 'A') Then
begin
TagName := selection.Item(i).href;
showmessage(TagName);
end;
end;
end;

 
试试这样行不行,URLStr就是网页URL。

procedure TYour.Create(Sender:TObject);
var
URLStr:String;//URL
FN:array [0..MAX_PATH-1] of char;
begin
SetString(URLStr,FN,GetModuleFileName(hInstance,FN,sizeof(FN)));
URLStr:=ExtractFileName(URLStr);
end;
 
用MSHTML的DOM很容易实现。
在MSHTML中有一个IHTMLDocuemnt2,有一个property是Links,就可以举出所有的links。
这个方法最好了。
 
谢谢BeginDelphi。
但我不想程序再放个庞大的MSHTML,而且那东西用起来很要命。
 
我发源代码你
 
接受答案了.
 
后退
顶部