亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#通過正則表達式實現提取網頁中的圖片

2020-01-24 01:20:47
字體:
來源:轉載
供稿:網友

目前在做項目中有處理圖片的部分,參考了一下網上案例,自己寫了一個獲取內容中的圖片地址的方法。

 一般來說一個 HTML 文檔有很多標簽,比如“<html>”、“<body>”、“<table>”等,想把文檔中的 img 標簽提取出來并不是一件容易的事。由于 img 標簽樣式變化多端,使提取的時候用程序尋找并不容易。于是想要尋找它們就必須寫一個非常健全的正則表達式,不然有可能會找得不全,或者找出來的不是正確的 img 標簽。

我們可以從 HTML 標簽的格式去想應該怎么建這個正則表達式。首先要想一下 img 標簽有幾種寫法,忽略大小寫不看的話,下面列出 img 標簽可能出現的幾種情況。
<img> <img/> <img src=/>

這一些標簽不用考慮,因為沒有圖片資源地址。
<img src = /images/pic.jpg/ > <img src =" /images/pic.jpg" > <img src= '/images/pic.jpg ' / >

這一些標簽都有圖片資源地址,另外還有一個特點就是有引號對,可能為單引號,也可能為雙引號。因為不需要同時匹配引號對,所以正則表達式可以這么寫:@"<img/s*src/s*=/s*[""']?/s*(?[^/s""'<>]*)/s*/?/s*>"
<img width="320" height="240" src=/images/pic.jpg onclick="window.open('/images/pic.jpg')">

因為 img 和 src 之間可能會有其他的參數,所以“<img”要有個單詞結束,比如說不能是“<imgabc”,同樣 src 前面也是一樣,使用單詞結束符“/b”有一個好處就是省去了表示空格的“/s*”。另外由于 img 標簽中不可以出現“<”、“>”這樣的符號,所以要改寫前面的正則表達式:@"<img/b[^<>]*?/bsrc/s*=/s*[""']?/s*(?<imgUrl>[^/s""'<>]*)[^<>]*?/?/s*>"
<img width="320" height="240" src = "
/images/pic.jpg" />

像這種可能會用回車符折行的問題有時候會出現,所以在有空格分開的地方要包含回車換行和 TAB 字符,另外在圖片地址中不能出現空格、TAB、回車和換行字符。

所以上面的正則表達式可以改成:@"<img/b[^<>]*?/bsrc[/s/t/r/n]*=[/s/t/r/n]*[""']?[/s/t/r/n]*(?<imgUrl>[^/s/t/r/n""'<>]*)[^<>]*?/?[/s/t/r/n]*>"

下面寫出取得HTML中所有圖片地址的類HvtHtmlImage:

using System.Text.RegularExpressions;namespace HoverTree.HoverTreeFrame.HvtImage{public class HvtHtmlImage{/// <summary> /// 取得HTML中所有圖片的 URL。 /// </summary> /// <param name="sHtmlText">HTML代碼</param> /// <returns>圖片的URL列表</returns> public static string[] GetHvtImgUrls(string sHtmlText){// 定義正則表達式用來匹配 img 標簽 Regex m_hvtRegImg = new Regex(@"<img/b[^<>]*?/bsrc[/s/t/r/n]*=[/s/t/r/n]*[""']?[/s/t/r/n]*(?<imgUrl>[^/s/t/r/n""'<>]*)[^<>]*?/?[/s/t/r/n]*>", RegexOptions.IgnoreCase);// 搜索匹配的字符串 MatchCollection matches = m_hvtRegImg.Matches(sHtmlText);int m_i = 0;string[] sUrlList = new string[matches.Count];// 取得匹配項列表 foreach (Match match in matches)sUrlList[m_i++] = match.Groups["imgUrl"].Value;return sUrlList;}}}

下面我們再來看一個例子

public Array MatchHtml(string html,string com)    {      List<string> urls = new List<string>();      html = html.ToLower();      //獲取SRC標簽中的URL      Regex regexSrc = new Regex("src=/"[^/"]*[(.jpg)(.png)(.gif)(.bmp)(.ico)]/"");      foreach(Match m in regexSrc.Matches(html))      {        string src = m.Value;        src = src.Replace("src=","").Replace("/"","");        if (!src.Contains("http"))          src = com + src;        if(!urls.Contains(src))        urls.Add(src);      }      //獲取HREF標簽中URL      Regex regexHref = new Regex("href=/"[^/"]*[(.jpg)(.png)(.gif)(.bmp)(.ico)]/"");      foreach (Match m in regexHref.Matches(html))      {        string href = m.Value;        href = href.Replace("href=", "").Replace("/"", "");        if (!href.Contains("http"))          href = com + href;        if(!urls.Contains(href))        urls.Add(href);      }      return urls.ToArray();    }
[DllImport("kernel32.dll")]    static extern bool SetConsoleMode(IntPtr hConsoleHandle, int mode);    [DllImport("kernel32.dll")]    static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int mode);    [DllImport("kernel32.dll")]    static extern IntPtr GetStdHandle(int handle);    const int STD_INPUT_HANDLE = -10;    const int ENABLE_QUICK_EDIT_MODE = 0x40 | 0x80;    public static void EnableQuickEditMode()    {      int mode; IntPtr handle = GetStdHandle(STD_INPUT_HANDLE);      GetConsoleMode(handle, out mode);      mode |= ENABLE_QUICK_EDIT_MODE;      SetConsoleMode(handle, mode);    }    static void Main(string[] args)    {      EnableQuickEditMode();      int oldCount = 0;      Console.Title = "TakeImageFromInternet";      string path = "E://Download//loading//";      while (true)      {        Console.Clear();        string countFile = "E://CountFile.txt";//用來計數的文本,以至于文件名不重復        int cursor = 0;        if (File.Exists(countFile))        {          string text = File.ReadAllText(countFile);          try          {            cursor =oldCount = Convert.ToInt32(text);//次數多了建議使用long          }          catch { }        }        Console.Write("please input a url:");        string url = "http://www.baidu.com/";        string temp = Console.ReadLine();        if (!string.IsNullOrEmpty(temp))          url = temp;        Match mcom = new Regex(@"^(?i)http://(/w+/.){2,3}(com(/.cn)?|cn|net)/b").Match(url);//獲取域名        string com = mcom.Value;        //Console.WriteLine(mcom.Value);        Console.Write("please input a save path:");        temp = Console.ReadLine();        if (Directory.Exists(temp))          path = temp;        Console.WriteLine();        WebClient client = new WebClient();        byte[] htmlData = null;        htmlData = client.DownloadData(url);        MemoryStream mstream = new MemoryStream(htmlData);        string html = "";        using (StreamReader sr = new StreamReader(mstream))        {          html = sr.ReadToEnd();        }        Array urls = new MatchHtmlImageUrl().MatchHtml(html,com);         foreach (string imageurl in urls)        {         Console.WriteLine(imageurl);          byte[] imageData = null;          try          {            imageData = client.DownloadData(imageurl);          }          catch { }          if (imageData != null && imageData.Length>0)            using (MemoryStream ms = new MemoryStream(imageData))            {              try              {                                string ext = Aping.Utility.File.FileOpration.ExtendName(imageurl);                ImageFormat format = ImageFormat.Jpeg;                switch (ext)                {                  case ".jpg":                    format = ImageFormat.Jpeg;                    break;                  case ".bmp":                    format = ImageFormat.Bmp;                    break;                  case ".png":                    format = ImageFormat.Png;                    break;                  case ".gif":                    format = ImageFormat.Gif;                    break;                  case ".ico":                    format = ImageFormat.Icon;                    break;                  default:                    continue;                }                Image image = new Bitmap(ms);                if (Directory.Exists(path))                  image.Save(path + "http://" + cursor + ext, format);              }              catch(Exception ex) { Console.WriteLine(ex.Message); }            }          cursor++;        }        mstream.Close();        File.WriteAllText(countFile, cursor.ToString(), Encoding.UTF8);        Console.WriteLine("take done...image count:"+(cursor-oldCount).ToString());      }          }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲伦理中文字幕| 91经典在线视频| 92国产精品久久久久首页| 隔壁老王国产在线精品| 亚洲国产天堂久久综合| 亚洲视频一区二区三区| 国产69久久精品成人看| 亚洲自拍av在线| 日韩av免费一区| 亚洲第一色在线| 国产成人啪精品视频免费网| 97成人精品区在线播放| 久久国产精品电影| 国产精品视频区| 北条麻妃一区二区在线观看| 日韩成人在线视频观看| 欧洲亚洲妇女av| 91精品免费看| 成人免费午夜电影| 久久免费在线观看| 日韩在线国产精品| 国产69精品99久久久久久宅男| 日韩精品中文字幕有码专区| 欧美夫妻性视频| 亚洲伊人久久大香线蕉av| 亚洲男人天堂久| 成人免费在线视频网站| 国产精品免费一区豆花| 亚洲午夜久久久影院| 欧美午夜xxx| 亚洲国产精品久久久久秋霞不卡| 55夜色66夜色国产精品视频| 欧美成人精品激情在线观看| 日韩在线观看免费高清完整版| 国产精品成人一区二区三区吃奶| 精品亚洲一区二区三区四区五区| 高清欧美性猛交| 日韩视频在线一区| 日韩欧美福利视频| 亚洲a级在线播放观看| 国产精品xxx视频| 国产女同一区二区| 亚洲成人999| 欧美电影在线播放| 欧美激情精品久久久久久大尺度| 亚洲a∨日韩av高清在线观看| 精品欧美激情精品一区| 日韩精品在线免费播放| 国产精品久久久久久影视| 97视频在线观看视频免费视频| 亚洲最新视频在线| 日韩美女在线播放| 日韩免费观看网站| 国产成人在线一区二区| 91欧美视频网站| 最近2019中文字幕大全第二页| 欧美日韩国产二区| 97视频在线免费观看| 亚洲激情在线观看| 亚洲国产精品高清久久久| 亚洲第一av在线| 欧美麻豆久久久久久中文| 欧美精品videosex极品1| 欧美巨大黑人极品精男| 亚洲午夜精品久久久久久久久久久久| 欧洲美女7788成人免费视频| 俺也去精品视频在线观看| 亚洲人成电影网站色…| 亚洲自拍av在线| 九九热最新视频//这里只有精品| 日韩av日韩在线观看| 91在线免费网站| 日韩av综合网| 欧美理论在线观看| 国产精品99久久久久久久久| 97超视频免费观看| 亚洲福利在线播放| 日韩中文字幕国产| 午夜精品一区二区三区视频免费看| 欧美激情在线狂野欧美精品| 久久成年人免费电影| 欧洲一区二区视频| 欧美性猛交xxxx乱大交蜜桃| 精品欧美国产一区二区三区| 国产精品入口尤物| 在线播放精品一区二区三区| 久久久这里只有精品视频| 亚洲无限乱码一二三四麻| 久久久中精品2020中文| 91精品视频免费看| 中文字幕av一区| 日韩欧美亚洲一二三区| 久久人人爽亚洲精品天堂| zzijzzij亚洲日本成熟少妇| 欧美高清在线播放| 亚洲第一区在线| 日本欧美黄网站| 亚洲欧美精品中文字幕在线| 日日摸夜夜添一区| 亚洲电影第1页| 中文字幕亚洲在线| 国产精品免费一区二区三区都可以| 91爱爱小视频k| 亚洲护士老师的毛茸茸最新章节| 欧美成人三级视频网站| 日韩成人中文字幕在线观看| 亚洲人线精品午夜| 亚洲一区二区三区在线免费观看| 欧美久久精品午夜青青大伊人| 亚洲欧美在线免费观看| 亚洲天堂久久av| 国模视频一区二区三区| 美女福利精品视频| 国产精品人成电影在线观看| 日韩精品视频在线免费观看| 91精品中文在线| 亚洲欧美综合精品久久成人| 欧美一级电影免费在线观看| 日韩欧美在线一区| 福利视频一区二区| 日韩电影大全免费观看2023年上| 粗暴蹂躏中文一区二区三区| 69久久夜色精品国产7777| 精品欧美aⅴ在线网站| 最近2019中文字幕mv免费看| 欧美午夜视频在线观看| 日本高清不卡在线| 欧美黑人巨大xxx极品| 日韩精品视频免费在线观看| 欧美在线视频免费| 亚洲欧美另类中文字幕| 一区二区三区精品99久久| 在线观看欧美日韩| 日韩在线观看免费av| 成人国产精品久久久久久亚洲| 欧美日韩另类字幕中文| 欧美猛男性生活免费| 欧美精品福利视频| 亚洲国产精品女人久久久| 欧美日韩国产精品专区| 亚洲国产毛片完整版| 久久久精品中文字幕| 国产一区二区三区在线播放免费观看| www.久久色.com| 在线观看久久久久久| 亚洲日本中文字幕| 日韩美女在线观看一区| 国产黑人绿帽在线第一区| 欧美高清在线观看| 欧美日韩人人澡狠狠躁视频| 午夜精品www| 欧美一区二区三区图| 日韩精品一区二区视频| 精品国产一区久久久| 国产精品专区h在线观看| 国产精品老女人视频| 成人国产精品av| 中文字幕欧美日韩精品| 国产精品极品尤物在线观看| 国产日韩欧美成人| 久久久久久久久久婷婷| 色婷婷综合久久久久| www.日韩av.com| 久久免费精品视频|