在C#中使用正则表达式筛选出图片URL并下载图片URL中的图片到本地
本功能主要用到的知识点如下:
1、正则表达式
2、C#中下载文件功能的实现
3、泛型集合的使用
4、进程的简单操作(用于结束当前程序)
下面就简单说一下是如何使用这些知识点的。先详细说下这个程序主要实现的功能是什么,现有一个文本文件里面都是从网页上复制下来的源代码。现需要将其中的以http、https、ftp开头,以.jpg,.png,.gif开头的图片URL地址筛选出来,并去访问这些链接,将URL中所对应的图片下载下来。经过分析后。决定使用正则表达式筛选URL地址。并使用WebClient类去实现下载的功能。代码如下:
using System.Text.RegularExpressions;
using System;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
namespace URLRegex
{
class Program
{
public static List<string> getUrl(string data)
{
List<string> strUrl= new List<string>();//定义泛型,用于存放抓取的URL
string regexStr = @"(http|ftp|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)+\.(png|jpg|gif)";//查找URL的正则表达式
Regex reg = new Regex(regexStr, RegexOptions.IgnoreCase);//正则表达式的类实例化
MatchCollection mc = reg.Matches(data);//进行匹配
if (mc.Count <= )//判断没有抓取到一条合法的URL
{
Console.WriteLine("未抓取到符合条件的URL,按任意键退出程序");
Console.ReadKey();
Process.GetCurrentProcess().Kill();
}
for (int i = ; i < mc.Count; i++)
{
strUrl.Add(mc[i].Groups[].Value);//将匹配的数据装入泛型集合
}
return strUrl;//返回这个泛型集合 }//得到URL public static void downLoad(List<string> tempUrl)
{ string currentPath = System.Environment.CurrentDirectory;//得到当前目录
Directory.CreateDirectory(currentPath + @"\photos\");//在当前目录下创建photos文件夹
string currentPathPhotos = currentPath + @"\photos\";//得到photos的路径 WebClient myDownload = new WebClient();//实例化webclient类,用于下载
int i = ; //用于图片的命名
Regex regJPG = new Regex(".jpg", RegexOptions.RightToLeft);//判断图片是不是.jpg格式
Regex regPNG = new Regex(".png", RegexOptions.RightToLeft);//判断图片是不是.png格式 foreach (string temp in tempUrl)//遍历获取到的图片URL,并下载和保存
{
Match mJpg = regJPG.Match(temp);
if (mJpg.Success)
{
string filePathJpg = currentPathPhotos + i + ".jpg";
try
{
myDownload.DownloadFile(temp, filePathJpg);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
} }
else
{
Match mPng = regPNG.Match(temp); if (mPng.Success)
{
string filePathPng = currentPathPhotos + i + ".png";
try
{
myDownload.DownloadFile(temp, filePathPng);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
} }
else
{
string filePathgif = currentPathPhotos + i + ".gif";
try
{
myDownload.DownloadFile(temp, filePathgif);
Console.WriteLine("下载成功");
i++;
}
catch
{
Console.WriteLine("下载失败");
}
} } } Process.Start("explorer", currentPathPhotos);//完成后立即呈现结果
}//实现下载 public static void Main()
{
string currentPath = Environment.CurrentDirectory;
string source= File.ReadAllText(currentPath+@"\test.txt");//读入文件
List<string> temp = getUrl(source);//筛选URL
Console.WriteLine("筛选后的URL地址如下:");
foreach (string t in temp)
{
Console.WriteLine(t.ToString());//输入URL
}
Console.WriteLine("正在下载图片……");
downLoad(temp);//下载图片
Console.WriteLine("\n下载结束,按任意键退出");
Console.ReadKey();
}//主函数
}
}
难点是:
1、正则表达式的构建,因为才接触到正则表达式,所以对于其正则表达式的构建不是很熟悉,自己也在百度了查了不少的资料。也看过别人的写的一些相似的正则表达式后。才写出了这个正则表达式。
2、异常的处理。比如文件打开失败,下载失败。未得到正确的URL地址等等。(解决方案:添加上try和catch在catch中用到了当前进程的结束)。
在C#中使用正则表达式筛选出图片URL并下载图片URL中的图片到本地的更多相关文章
- 在没有界面的类中,实现弹出UIAlertView || 在没有界面的类中,刷新程序界面 思路
+(DisplayErrorMsg *)sharedDisplayErrorMsg { static DisplayErrorMsg *instance = nil; @synchronized(in ...
- Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接
现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...
- SQL Server 2008 R2——创建函数 筛选出字符串中的数字 筛选出字符串中的非数字
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- asp.net core 2.2 中的过滤器/筛选器(上)
ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...
- C# 网络编程之webBrowser获取网页url和下载网页中图片
该文章主要是通过C#网络编程的webBrowser获取网页中的url并简单的尝试瞎子啊网页中的图片,主要是为以后网络开发的基础学习.其中主要的通过应用程序结合网页知识.正则表达式实现浏览.获取url. ...
- groovy中的正则表达式操作符【groovy】
groovy中对于正则表达式的书写进行了简化,同时引入了新的操作符,使得正则表达式使用起来比较方便简单. 对于书写的改进: 比如 assert "\\d" == /\d/ 也就是在 ...
- 关于Lab3中对于正则表达式的应用
在这里记录一下关于软件构造课程Lab3中关于正则表达式的应用. 在实验内容中,要求用正则表达式来匹配读入文件的内容,从而取得构建图需要的相关信息. 举个例子,读入的文件(GraphPoetTestFi ...
- python图片爬虫 - 批量下载unsplash图片
前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...
- 如何从两个List中筛选出相同的值
问题 现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证. 转换为List socialList,和List idList,从二者中找出匹配的社保卡. 模型 创建社保卡类 /** * @a ...
随机推荐
- postgresql pgagent 的安装及使用
pgagent 作为postgresql的一个任务调度代理,在postgresql 9.0 以前 是附带在pgadmin 包下面的,只是默认不安装,9.0之后作为了一个单独是的安装包.所以要使用pga ...
- [mysql]tpcc相关及画图
参考:http://blog.chinaunix.net/uid-26896862-id-3563600.html 参考:http://blog.chinaunix.net/uid-25266990- ...
- Java中x=x+1 与x+=1 的一点区别
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/04/01/2994028.html 作者:十年半山 今天同悦姐学到了关于Java的复合 ...
- ? 初识Webx 2
初识Webx 1: http://www.cnblogs.com/lddbupt/p/5547189.html Webx Framework负责完成一系列基础性的任务. 比如系统初始化和响应请求. 系 ...
- Maven-Standard Directory Layout
顶层工程描述文件: pom.xml. 此外, 还有一些供用户阅读以快速理解工程的文本性文档, 如: readme.txt, license.txt,等. 该结构下只有2个子目录, src和target ...
- 【BZOJ】1914: [Usaco2010 OPen]Triangle Counting 数三角形
[题意]给定坐标系上n个点,求能构成的包含原点的三角形个数,n<=10^5. [算法]极角排序 [题解]补集思想,三角形个数为C(n,3)-不含原点三角形. 将所有点极角排序. 对于一个点和原点 ...
- 【vijos】P1448 校门外的树
[题意]两种操作,[L,R]种新的树(不覆盖原来的),或查询[L,R]树的种类数.n<=50000. [算法]树状数组||线段树 [题解]这题可以用主席树实现……不过因为不覆盖原来的,所以有更简 ...
- 每个 Java 开发者都应该知道的 5 个注解
自 JDK5 推出以来,注解已成为Java生态系统不可缺少的一部分.虽然开发者为Java框架(例如Spring的@Autowired)开发了无数的自定义注解,但编译器认可的一些注解非常重要. 在本文中 ...
- 关于Redis在Linux手动安装配置
安装: 1.获取redis资源 wget http://download.redis.io/releases/redis-5.0.0.tar.gz 2.解压 tar xzvf redis-5.0.0. ...
- 9、MySQL常见的函数?
请参考下面的博客文章: MySQL常见的函数