有什么方法能够让我简单的做到分析HTML,我想找出一个HTML的所有联接。(100分)

  • 主题发起人 satanmonkey
  • 开始时间
S

satanmonkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我的目的是得到如<img>,<a>等标签中的哪个URL。
然后我根据哪个url把文件下下来。
 
用WebBrowser,加载网页之后,使用下面的过程。

uses MSHTML;

var
   doc:IHTMLDocument2;
   all:IHTMLElementCollection;
   len,i:integer;
   item:OleVariant;
  begin
   doc:=WebBrowser1 .Document as IHTMLDocument2;
   all:=doc.Get_links;             //doc.Links亦可
   len:=all.length;
   for i:=0 to len-1 do begin
    item:=all.item(i,varempty);        //EmpryParam亦可
    memo1.lines.add(item.href);
   end;
  end;
 
这样只是把<A>标签搞定啊,有什么办法能让我把所以标签都分析出来,好多标签都象外连接的
比如<IMG SRC=xxxx>
 
那你自己把所有的标签都过一边
 
什么叫所以标签都过一遍?
 
读到网页源代码--->全文查找 "a href="
| |
| 取出 url 保存到列表
| |
| 剔除列表中的重复 url
| |
| 逐个取出 url 进行下一轮链接
| |
|____________________|
 
如果想连<IMG SRC=xxx>里边的链接都找出来,你只好自己过滤一边网页的源码,找到所有
<>,分析每个<>之间的字符串,看看那些是链接了。
 
感谢罗西岛主,seraph_q
不过你们的方法好象实现起来颇难
不是所以<A>标签的后面就接着是 href属性的。这样我在处理前必须格式化
好象很费工夫。
既然IE可以解析,有没有利用ie的办法呢?
 
你目的是得到如<img>,<a>等标签中的哪个URL,用罗西岛主的方法就可以了,
全文查找 "a href="和<img>,把网页文档遍历一次就有了 [:)]
 
我做过一个可以下载页面上所有图片的程序,内嵌ie,下面是取图的核心代码:
ieThis 是 IEThis: IWebbrowser2;
其实用的是IHtmlDocument2接口和IHtmlElementCollection接口
procedure TForm1.DownLoadBtnClick(Sender: TObject);
var
doc: IHTMLDocument2;
all,Img: IHTMLElementCollection;
len,i,j,flag: integer;
item: IHTMLElement;
vAttri: Variant;
ImgList: TStrings;
UrlStrM: TMemoryStream;
function GetAddrs(ImageList: TStrings): integer;
var
i: integer;
begin
Result := 0;
for i := 0 to ImagesForm.ImgsAddr.Items.Count-1 do
begin
if ImagesForm.ImgsAddr.Checked then
ImageList.Add(ImagesForm.ImgsAddr.Items);
end;
Result := ImageList.Count;
end;


begin
if Assigned(IEThis) then begin
Addrs.Clear;
doc := iethis.document as IHTMLDocument2;
all := doc.Get_all;
Img := Doc.Get_Images;
len := Img.get_length;
for i := 0 to len-1 do begin
item := Img.item(i,varempty) as IHTMLElement;
// if item.get_tagname = 'A' then
begin
flag := 0;
//VAttri := item.getAttribute('protocol',flag);
//if vAttri = 'http:' then
begin
vAttri := item.getAttribute('href',flag);
// if ExtractFileExt(Vattri)='.jpg' then
Addrs.Add(VAttri);
end;
end;
end;
ImagesForm := TImagesForm.Create(application);
try
ImagesForm.ImgsAddr.Items.Assign(Addrs);
//for j := 0 to ImagesForm.ImgsAddr.Count-1 do
// Imagesform.ImgsAddr.Checked[j] := true;
if ImagesForm.ShowModal = mrOK then
begin
UrlStrM := TMemoryStream.Create;
ImgList := TStringList.Create;
try
if GetAddrs(ImgList) = 0 then
begin
ShowMessage('Empty!');
exit;
end;
begin
//ÒÔÏÂÊÇÏÂÔصĴúÂë
for I := 0 to ImgList.count-1 do // Iterate
begin
UrlStrM.Clear;
IDHttp1.Get(ImgList,UrlStrM);
UrlStrM.SaveToFile(ImagesForm.Path.Text+'/'+ExtractUrlFileName(ImgList));
end; // for

//NMFTP1.Disconnect;
end;
finally
ImgList.Free;
end;
end;
finally
ImagesForm.Free;
end;
end;
end;
 

Similar threads

回复
0
查看
904
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
885
DelphiTeacher的专栏
D
顶部