Extractor的工做是从下载的网页中将它包含的全部URL提取出来。这是个细致的工做,你须要考虑到全部可能的url的样式,好比网页中经常会包含相对路径的url,提取的时候须要将它转换成绝对路径。这里咱们选择使用正则表达式来完成连接的提取。html
html标签中的连接地址一般会出如今href属性或者src属性中,因此咱们采用两个正则表达式来匹配网页中的全部连接地址。正则表达式
网页连接提取器Extractor类:数组
using System; using System.Collections.Generic; using System.Linq; using Crawler.Common; namespace Crawler.Processing { /// <summary> /// Extractor的工做是从下载的网页中将它包含的全部URL提取出来。这是个细致的工做,你须要考虑到全部可能的url的样式,好比网页中经常会包含相对路径的url,提取的时候须要将它转换成绝对路径。 /// </summary> public class Extractor { public List<Uri> GetAllUrl(string html, string host) { var list = new List<string>(); //匹配href属性 var href = RegexHelper.ExtractStringArray(html, "href *= *['\"]*(\\S+)[\"']"); //去掉匹配到字符串的空格、双引号和前面的href=,获得连接 var temp = from h in href select h.Replace(" ", "").Replace("\"", "").Substring(5); //加入数组 list.AddRange(temp); //匹配src属性 var src = RegexHelper.ExtractStringArray(html, "src *= *['\"]*(\\S+)[\"']"); temp = from s in src select s.Replace(" ", "").Replace("\"", "").Substring(4); list.AddRange(temp); //去重 list = list.Distinct().ToList(); //将连接地址中的相对路径转换为绝对路径 var uriList = list.Select(s => s.IndexOf("http://", StringComparison.Ordinal) != 0 ? new Uri(new Uri(host), s) : new Uri(s)).ToList(); return uriList.ToList(); } } }