/// <summary> /// 将html内容中的所有src和href地址转为为绝对地址,然后使用指定编码和路径保存为html文件(使用此方法,需要指定当前页面的Url) /// </summary> /// <param name="filePath">文件路径</param> /// <param name="ignoreScript">保存的时候是否忽略Script标签,若为true,则忽略JS</param> /// <returns>如果下载成功,返回文件的本地路径,否则返回null</returns> public string SaveHtml(string filePath, bool ignoreScript) { string htmlContent = this.html; if (string.IsNullOrEmpty(pageUrl)) { throw new SpiderException("未指定当前url"); } //如果忽略JS if (ignoreScript) { htmlContent = this.FilterScript(); } //将所有的href转换为绝对路径 htmlContent = RegexCollection.RegHref.Replace(htmlContent, (mat) => { return("href=\"" + PathUtility.ConvertToAbsoluteHref(this.pageUrl, mat.Groups["href"].Value) + "\""); }); //将所有的src转换为绝对路径 htmlContent = RegexCollection.RegSrc.Replace(htmlContent, (mat) => { return("src=\"" + PathUtility.ConvertToAbsoluteHref(this.pageUrl, mat.Groups["src"].Value) + "\""); }); return(FileUtility.SaveText(filePath, htmlContent, this.encode)); }
/// <summary> /// 替换将js、css、图片、flash等文件下载到本地后,调用此方法获取在页面中引用本地文件的路径 /// </summary> /// <param name="match">匹配到的js、css、图片、flash等标签的正则实例</param> /// <param name="dirConfig">目录配置的实例,从中判断是否根据url结构保存</param> /// <param name="resourceUrl">当前html页面或者css文件的url。此url用于将其内容中的相对地址转换为绝对地址并下载</param> /// <param name="referenceDir">引用图片的文件所在目录(可能是html文件所在目录,也能是css文件所在目录)</param> /// <param name="saveDir">下载文件存放的目录</param> /// <param name="regGroupName">指定匹配url的正则分组的组名</param> /// <param name="urlHandle">指定对匹配url(也就是href或者src)进行处理的函数回调,此回调主要对url进行一些处理(例如去引号等等)</param> /// <param name="downloadHandle">指定自定义下载处理的函数回调,此回调返回下载文件的本地路径或者占位符</param> /// <param name="async">是否异步下载</param> /// <param name="dic">记录异步下载信息的字典</param> /// <returns>返回替换后的标签字符串</returns> internal string MatchUrl(Match match, DirConfig dirConfig, string resourceUrl, string referenceDir, string saveDir, string regGroupName, MatchCallback urlHandle, MatchCallback downloadHandle, bool async, Dictionary <string, string> dic) { //文件的地址(可能是相对也可能是绝对)、文件的绝对Url地址、以及保存到本地以后的本地路径 string href, url, localPath = ""; href = match.Groups[regGroupName].Value; if (null != urlHandle) { href = urlHandle(href); } url = PathUtility.ConvertToAbsoluteHref(resourceUrl ?? this.pageUrl, href); //如果设置了根据网站url结构按对应目录存储资源,则重新设置保存目录的路径 if (dirConfig.UseWebSite) { saveDir = PathUtility.GetSaveDir(this.PageUrl, url, dirConfig.HtmlDirPath); } //如果使用异步下载 if (async) { //如果未指定异步下载函数 if (null == downloadHandle) { localPath = this.GetPlaceHolder(); //开始异步下载资源 Spider.SaveResourceAsync(url, saveDir, new Action <string>(delegate(string filePath) { lock (dic) { dic[localPath] = null == filePath ? url : PathUtility.GetRelativePath(referenceDir, filePath); } })); } else { localPath = downloadHandle(url); } if (!dic.ContainsKey(localPath)) { lock (dic) { dic.Add(localPath, null); } } }//如果使用同步下载 else { if (null == downloadHandle) { //保存文件,如果成功,则返回文件保存后的本地路 localPath = Spider.SaveResource(url, saveDir); } else { localPath = downloadHandle(url); } //如果保存失败,则引用绝对url地址 if (string.IsNullOrEmpty(localPath)) { localPath = url; } else { localPath = PathUtility.GetRelativePath(referenceDir, localPath); } } //使用localPath替换html内容中的引用路径 return(match.Value.Replace(href, localPath)); }