向各位求助!若答案有效马上给200分!要源代码。其实不难,只是我初学,有很多都不会,书上也没写。(200分)

  • 主题发起人 主题发起人 abcxyz
  • 开始时间 开始时间
A

abcxyz

Unregistered / Unconfirmed
GUEST, unregistred user!
已知某个网页的网址,如http://www.***.com/abc/index.htm,怎样得到该网页源文件里某
种文件类型的链接地址?假设上述网页源文件为:
<html>
......
<src="../abc/XXX.exe">
<a href="../abc/XXX.jpg">
<src="../abc/xyz/YYY.exe>
......
</html>
如何才能获得其中所有扩展名为.exe文件的那串地址,比如该例子就是
../abc/XXX.exe
../abc/xyz/YYY.exe
并把所有扩展名为.exe文件的地址分别保存到一个字符串变量里?
用一个Edit控件(用于输入上面那个网址),一个Button控件(按下后开始上述操作,并
得到最后那个保存了.exe文件地址的变量)。
特别注意的是,事先并不知道该网页源文件里有多少个.exe文件的链接,另外要把每个.exe
文件的链接地址(如上述两个地址)分别保存在不同的字符串变量里。注意最后需要的地址
是../abc/XXX.exe 这样的,而不是这种<src="../abc/XXX.exe">带中括号和引号的。
以上是我的问题,我是初学者,这问题在书上又找不到答案,已经困扰我好多天了,
实在没办法,我现在真的很着急啊,请各位一定帮忙!
还请知道的朋友附上完整的源代码,最好能有简单的说明,我好慢慢研究。
源代码有效的话,我一会儿马上给您加上200分,绝不食言。
先谢谢大家了!
 
那好,你現在知道怎樣從網上下載某一個地址的源文件了吧!
只要會了就好說了!(不會的話請速回答我)
將它的所有源文件吸下來后.現呢,便進行分析了!
比方將所有源文件吸下來放到一個MEMO控件中,再進行一個字符一個字符的分析,當發現當前
字符為E開,則馬上分析后二位字符是否為XE呢,如果是的話再分析前一個字符是否為一點呢(".")
如果確實為.exe,即你要找的了.那麼再往前退至"后面第一個字符處開始Copy字符到"或.EXE
結束處就可以了,簡單吧.
原理就這樣的.
 
呵呵,那你的话:“則馬上分析后二位字符是否為XE呢,如果是的話再分析前一個字符是否為一點呢(".")
如果確實為.exe,即你要找的了.那麼再往前退至"后面第一個字符處開始Copy字符到"或.EXE
結束處就可以了,簡單吧.”只怕也被分析成几个.exe了。
----[:D]
 
sydan,你在吗?
另外你问我会不会下载源文件,就是不会啊!只会用浏览器的查看源文件,不会用Delphi
编程来下载源文件,我试过NMHTTP,但总是错误,实在没人教我,也没书可查。
你后面说的我虽明白你的意思,但不会写代码啊,能给出源代码就好了!谢谢!
 
如果大家觉得难,可以先告诉我你们知道的前几步,比如怎样得到该网页的源文件,
我试过用NMHTTP去得到EDIT里的地址,但运行后只要一点按钮,总是出错,不知怎么回事。
 
procedure TForm1.FormCreate(Sender: TObject);
var strUrl:pchar;
strL: string;
strurltemp:pchar;
INtPos:integer;
intpostemp:integer;
i:byte;
begin
intpostemp :=0;
strUrl:='<td><src=../../abc.exe>' ;
IntPos:=pos('.exe',strUrl);//.exe的位置
form1.caption :=inttostr(intpos);
if intpos = 0 then
begin
messagedlg('wrong!no exe',mtinformation,[mbok],0);
close;
end;
{ for i:= intPos to 1do
begin
if char(byte(strurl)) = '<' then
begin
intposTemp := i +1;
break;//jump out
end;
end;
}
strlcopy(strurlTemp,strurl,intpos);//生成新的数据段
intpostemp:=strtoint(strRscan(strurlTemp,'<'));
//从两个点中间取字符成串;
for i := intpostemp to intposdo
strl:=strl + char(byte(strUrl));
messagedlg('your url is' + strl,mtinformation,[mbok],0);
end;

end.
学DELPHI才几天,不好意思,大致思路应该是这样吧
pt:delphi怎么没有left/replace/right这样的函数呀,从VB想转过来看来很难哦:(
好像有报错阿,怎么办?
 
先谢谢了,能否把这两句解释一下先。
strUrl:='<td><src=../../abc.exe>' ;
IntPos:=pos('.exe',strUrl);//.exe的位置
 
heipi2002
能解释一下吗?谢谢!
 
我的意見是用DHTML控件.
然後是這樣的
DHTMLEdit1.LoadURL('http://www.163.net');
DHTMLEdit1.DOM.links.Item...
或者DHTMLEdit1.DOM.all......看你的JavaScript學的怎麼樣了,我不太會啊[:(]
 
//下载并解析,将结果显示到memo中,用到了idhttp控件。调试通过,给分吧!
//源码在http://iapollo.diy.163.com/getlink.rar下载。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Panel1: TPanel;
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure IdHTTP1Workbegin
(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdHTTP1WorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
procedure IdHTTP1Work(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCount: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure getLink(str:String);
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
body:String;
begin
Memo1.Clear;
body:=idHTTP1.Get(Edit1.Text);
//得到html源文件
//Memo1.Text:=body;
getLink(body);
end;

procedure TForm1.IdHTTP1Workbegin
(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Max:= AWorkCountMax;
end;

procedure TForm1.IdHTTP1WorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
ProgressBar1.Position:= 0;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position:= AWorkCount;
end;

procedure TForm1.getLink(str: String);
var
i,j:Integer;
isLink:Boolean;
function geturl(linkStr:String):String;
var
eqpos,m,n,lsLen:Integer;
begin
Result:='';
eqpos:=Pos('=',linkStr);
lsLen:=Length(linkStr);
if linkStr[eqpos+1]='"' then
begin
for m := 0 to lsLen-1do
begin
if linkStr[m+eqpos+2]='"' then
break;
end;
Result:=copy(linkStr,eqpos+2,m);
end
else
begin
for n := 0 to lsLen-1do
begin
if linkStr[n+eqpos+1]=' ' then
break;
end;
Result:=copy(linkStr,eqpos+1,n);
end;
end;

begin
isLink:=false;
for i := 0 to Length(str)-1do
begin
if str+str[i+1]='<a' then
isLink:=true;
if str+str[i+1]+str[i+2]+str[i+3]='<src' then
isLink:=true;
if isLink then
begin
for j := 0 to Length(str)-i-1do
begin
if str[i+j]='>' then
begin
break;
end;
end;
Memo1.Lines.Add(geturl(copy(str,i,j+1)));
isLink:=false;
end;

end;

end;

end.
 
我试过那个程序了,但好像不对啊,得到的都是什么结果啊?并不是某种扩展名的链接啊。
以下是打开163网页后显示的一些结果,摘抄一部分:
beyeauction
http://auctions.163.com/myshop/myshop.jsp?id=handsomel
http://auctions.163.com/myshop/myshop.jsp?id=2411778
http://ad.cn.doubleclick.net/clk;4393959;7326599;i?http://im9.eachnet.com/fu/co/rd.php?http://www.eachnet.com/fu/search/mbd/pcshow/index.php?page_no=0&amp;goods_class=3101&amp;type_auction=y&amp;type_fix=y&amp;havepic=&amp;price_low=3000&amp;price_high=6000&amp;sq=yes&amp;yft=&amp;ismember=y&amp;sortype=i%3Av_end_date&amp;sortorder=asce%3A&amp;page_size=50&amp;name_old=%B1%CA%BC%C7%B1%BE&amp;op=0&amp;fclass=&amp;searchdesc=y&amp;lstRegion=CN&amp;seller_id=&amp;timelimit=&amp;sellertru=&amp;name=%B1%CA%BC%C7%B1%BE&amp;search_again=
http://ad.cn.doubleclick.net/clk;4393967;7326599;h?http://im9.eachnet.com/fu/co/rd.php?http://static.eachnet.com/fu/other/action/actnow.ph
http://vip.163.com/ target=_top class=l
http://vip.163.com/payment/Sort.shtml target=_to
http://vip.163.com
http://mail.163.com/ssy_read.htm
http://popme.163.com/sms/vip.htm
http://vip.163.com/payment/vip.html
http://power.163.com/adpage/vip/may/cjjg.htm
http://corp.163.com/corpnews/index.html class=lb target=_to
http://corp.163.com/corpnews/editor/020830/020830_1274.html class=l
http://corp.163.com/corpnews/020807/020807_1270.html class=l
http://corp.163.com/corpnews/editor/020404/020404_1137.html class=l
这都是什么呢?
 
所以说有点小bug吗!不过上面的帖子已经改好了,你再试试!
下面的结果是通过http://www.delphibbs.com/delphibbs/dispq.asp?lid=1414973
得到的
rules.asp
register.asp
download.asp
index.asp
listroom.asp
listq.asp
listu.asp
dispu.asp
askqn.asp
uonline.asp
calendar.asp
http://richsearch.com
mailto:yysun@263.net
这程序没有考虑特别文件名的问题,不过也很好改,检查所得结果的后三个字符就行了。
你要是做不了的话我帮你做。
/////////////////////////////////////////////////////////////////////////////
2002-11-5 23:19
下面这段代码是可以得到网页中所有exe文件链接的代码,记得找一个有exe链接的网页试试
你要试163的话什么也得不到,最好自己在本地先做一个测试页。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Panel1: TPanel;
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure IdHTTP1Workbegin
(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdHTTP1WorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
procedure IdHTTP1Work(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCount: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure getLink(str:String);
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
body:String;
begin
Memo1.Clear;
body:=idHTTP1.Get(Edit1.Text);
//得到html源文件
//Memo1.Text:=body;
getLink(body);
end;

procedure TForm1.IdHTTP1Workbegin
(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Max:= AWorkCountMax;
end;

procedure TForm1.IdHTTP1WorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
ProgressBar1.Position:= 0;
end;

procedure TForm1.IdHTTP1Work(Sender: TObject;
AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position:= AWorkCount;
end;

procedure TForm1.getLink(str: String);
var
i,j:Integer;
isLink:Boolean;
tmpurl:String;
function geturl(linkStr:String):String;
var
eqpos,m,n,lsLen:Integer;
tmpLink:String;
begin
Result:='';
eqpos:=Pos('=',linkStr);
lsLen:=Length(linkStr);
if linkStr[eqpos+1]='"' then
begin
for m := 0 to lsLen-1do
begin
if linkStr[m+eqpos+2]='"' then
break;
end;
tmpLink:=copy(linkStr,eqpos+2,m);
if ExtractFileExt(tmpLink)='.exe' then
Result:=tmpLink;
end
else
begin
for n := 0 to lsLen-1do
begin
if (linkStr[n+eqpos+1]=' ') or (linkStr[n+eqpos+1]='>') then
break;
end;
tmpLink:=copy(linkStr,eqpos+1,n);
if ExtractFileExt(tmpLink)='.exe' then
Result:=tmpLink;
end;
end;

begin
isLink:=false;
for i := 0 to Length(str)-1do
begin
if str+str[i+1]='<a' then
isLink:=true;
if str+str[i+1]+str[i+2]+str[i+3]='<src' then
isLink:=true;
if isLink then
begin
for j := 0 to Length(str)-i-1do
begin
if str[i+j]='>' then
begin
break;
end;
end;
tmpurl:=geturl(copy(str,i,j+1));
if Pos('exe',tmpurl)>0 then
Memo1.Lines.Add(tmpurl);
isLink:=false;
end;

end;

end;

end.

//////////////////////////////////////////////////////////////////////////
2002-11-6 10:00
to sydan:下载网页源文件的代码也要mail啊!?
不就简简单单的一句idHTTP1.Get(url)吗!
to heipi2002:
>>代码里面判断好像有点问题,html代码里面<a href=a.exe >和<a href="a.exe">效
>>果相同<a href>和<a href... >效果也是一样的,所以代码思路可能会出现问题;
这个问题我考虑到了,你试试程序就知道了。有没有"都是一样的。
to Richard3000:
我用了ExtractFileExt函数,误差可能会小点。[:)]
 
TO:abcxyz
對不起,我昨天20:00就走了,因為沒有看到你再提問所以我以為你知道了.這樣吧,你有QQ號
嗎?我的是89627243,你Q我吧,要不你就將你的郵箱告訴我.這樣我就好寄一份(含源代碼)的
下載網頁腳本文件的程序給你.好嗎?
 
我做到晚上十点,呵呵要回家了,不好意思,后面iapollo做的代码要慢慢研究
我调试过程中对pchar,string转换很头疼,共同学习阿,呵呵,不用给分:)
 
呵呵,用copy函数,明白了,没有用过,不过iapollo的代码我运行有一两个小问题哦,
idhttp没有?我是delphi5完全版呀!
代码里面判断好像有点问题,html代码里面<a href=a.exe >和<a href="a.exe">效果相同
<a href>和<a href... >效果也是一样的,所以代码思路可能会出现问题;
比如不是用标准的网页编辑软件写的网页;
我觉得我那个判断会更好,先判断'.exe'的位置posExe,然后copy(strUrl,'前面一个
等号的位置',posExe+4),得到这个字段后要去掉里面的空格,我懒得写了,好累哦:)
 
不對,每一個對的!
思路是這樣的
1.根據URL得到HTML源文件
2.從源文件中得到所有的src和a
3.從中檢索exe
用字父串查找是不合理的.你不能保證含有<a.........exe就是你要的東西.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部