如何提取网页中所有链接

见过“网际快车”的“使用网际快车下载全部链接”这个功能吗?想实现它,我们可以这样做:

IE有几个有用的接口,我们可以用它来提取网页所有链接。

一、基本原理

首先是用IHTMLDocument2的get_links,来获取IHTMLElementCollection接口,再通过IHTMLElementCollection来获取IHTMLAnchorElement,而IHTMLAnchorElement接口的get_href就是我们想要的,通过循环获取,我们就可以得到网页的所有链接了!

二、具体代码

{
  TCHAR HostName[2*MAX_PATH];
  CComPtr<IDispatch> spDispatch;
  CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc2;
  CComPtr<IHTMLElementCollection> pElementCol;
  CComPtr<IHTMLAnchorElement> pLoct;
  // TODO: Add your control notification handler code here
  int n = m_LinksList.GetItemCount();//GetCount();
  for (int i = 0; i < n; i ++){
    IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_LinksList.GetItemData(i);
    if (pBrowser){
      pBrowser->Release();
    }
  }
  m_LinksList.DeleteAllItems();
  m_LinksNum = 0;
  Log("**************************************************************");
  Log("\r\n");
  if (m_spSHWinds){
    int n = m_spSHWinds->GetCount();
    for (int i = 0; i < n; i++){
      _variant_t v = (long)i;
      IDispatchPtr spDisp = m_spSHWinds->Item(v);
      SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);  //生成一个IE窗口的智能指针
      if (spBrowser){
        if (SUCCEEDED(spBrowser->get_Document( &spDispatch)))
          pDoc2 = spDispatch;
        if(pDoc2!=NULL)
        {
          if (SUCCEEDED(pDoc2->get_links(&pElementCol)))
          {
            //  AfxMessageBox("IHTMLElementCollection");
            long p=0;
            if(SUCCEEDED(pElementCol->get_length(&p)))
              if(p!=0)
              { 
                m_LinksNum = m_LinksNum+p;
                UpdateData(FALSE);
                for(long i=0;i<=(p-1);i++)
                {
                  BSTR String;
                  _variant_t index = i;
                  if(SUCCEEDED(pElementCol->item( index, index, &spDispatch)))
                  if(SUCCEEDED(spDispatch->QueryInterface( IID_IHTMLAnchorElement,(void **) &pLoct)))
                  pLoct->get_href(&String);
                  ZeroMemory(HostName,2*MAX_PATH);
                  lstrcpy(HostName,_bstr_t(String));
                  m_LinksList.InsertItem(i,HostName);
                  m_LinksList.SetCheck(i,TRUE);

                  pLoct->get_hostname(&String);
                  ZeroMemory(HostName,2*MAX_PATH);
                  lstrcpy(HostName,_bstr_t(String));
                  if(lstrlen(HostName))
                  {
                    m_LinksList.SetItemText(i,1,HostName);
                    Log(HostName );
                    Log("\r\n");
                  }

                }
              }
          }
        }
      }
    }
  }
}

本程序在VC7+WINXP下编译通过,详细请看源代码!

本文配套源码

时间: 2024-09-20 06:03:36

如何提取网页中所有链接的相关文章

提取网页中的链接并生成xml

using System; using System.Xml; using System.Text; using System.Net; using System.IO; using System.Collections; using System.Text.RegularExpressions; public class App { public static void Main() { string strCode; ArrayList alLinks; Console.Write("请输入

URL 筛选小工具 提取网页中的链接地址_vbs

使用方法:将下面的代码保存为jb51.vbs然后拖动你保存在本地的htm页面,拖放在这个vbs即可 复制代码 代码如下: '备注:URL筛选小工具 '防止出现错误 On Error Resume Next 'vbs代码开始---------------------------------------------- Dim p,s,re If Wscript.Arguments.Count=0 Then Msgbox "请把网页拖到本程序的图标上!",,"提示" Ws

正则表达式,提取网页中的链接地址

<td class=cate width="45%" style="word-break:break-all">       <a class=M href="http://jmfengcai.cn.alibaba.com/athena/companydetail/jmfengcai.html" onMouseDown="return aliclick(this,'?alishop=companylistcompany

正则表达式,提取网页中的链接地址_正则表达式

<td class=cate width="45%" style="word-break:break-all">       <a class=M href="http://jmfengcai.cn.alibaba.com/athena/companydetail/jmfengcai.html" onMouseDown="return aliclick(this,'?alishop=companylistcompany

ASP.NET实现抓取网页中的链接

asp.net|链接|网页 输入一个地址,就可以把那个网页中的链接提取出来,下面这段代码可以轻松实现,主要的是用到了正则表达式.      GetUrl.ASPx代码如下:      <%@ Page Language="<a href="http://dev.21tx.com/language/vb/" target="_blank">VB</a>" CodeBehind="GetUrl.aspx.vb&

如何提取网页中想要的信息并保存到text文件中

问题描述 如题,如何提取网页中想要的信息并保存到text文件中! 解决方案 解决方案二:该回复于2011-04-11 10:56:55被版主删除解决方案三:把网页中想要显示的内容转发(或者提交)给一个servlet控制器在控制器里面通过IO然后写到text中去解决方案四:提取的话,用正则过滤.解决方案五:引用2楼javaxiaochouyu的回复: 把网页中想要显示的内容转发(或者提交)给一个servlet控制器在控制器里面通过IO然后写到text中去 提取网页中想要的内容,这个怎么弄呢··初研

C#正则表达式通过HTML提取网页中的图片src

原文:C#正则表达式通过HTML提取网页中的图片src 目前在做HoverTreeCMS项目中有处理图片的部分,参考了一下网上案例,自己写了一个获取内容中的图片地址的方法. 可以先看看效果:http://tool.hovertree.com/a/zz/img/  一般来说一个 HTML 文档有很多标签,比如"<html>"."<body>"."<table>"等,想把文档中的 img 标签提取出来并不是一件容易

android-Android 客户端中的webview怎么实现把网页中所有链接都在客户端中打开显示

问题描述 Android 客户端中的webview怎么实现把网页中所有链接都在客户端中打开显示 如题 点击按钮打开一个webview 在这个网页中有其他的页面的超链接 怎么实现点击其他页面的超链接 都在本webview中显示. 解决方案 只要实现以下接口就可以让webView内的超链接在本应用内处理. webview.setWebViewClient( new WebViewClient() { public boolean shouldOverrideUrlLoading( WebView v

怎么提取网页中的视频、音乐歌曲、flash、图片等多媒体文件

打开网页后,发现里面有好看的视频.好听的音乐.好看的图片.很炫的flash,是不是想把它们弄到自己电脑上或手机.mp4上?但很多时候视 频无法下载,音乐只能试听,或者好听的背景音乐根本就不知道什么名字,更别说怎么下了:至于图片直接右键另存为即可,不过如果网页突然关掉了,但又想把看 过的图片弄下来,而忘了图片网页地址或者不想再通过历史记录打开,这时又该怎么办? 其实这些问题都能很好的解决,并且很简单,只要用一个软件来替你从电脑的缓存中搜索一下就OK了,因为网页中显示的内容基本上全部都在缓存中,如果