[爬蟲學習筆記]用於提取網頁中全部連接的 Extractor 模塊

        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();
        }
    }
}
相關文章
相關標籤/搜索