从网上收集EMail(正则表达式,C#源码)

本文介绍了一种使用.NET框架编写网络蜘蛛程序的方法,重点介绍了如何利用正则表达式从网页中高效地提取电子邮件地址,并提供了完整的代码示例。
    最近一直琢磨着写一个网络蜘蛛程序,专门负责收集一些自己感兴趣的东西。用.net写程序从网上取得网页源码比较容易实现,蜘蛛程序的难点在于两个方面,一是如何多线程的自动化处理(即从一个地址跳到另一个地址),另一个是从网页中提取指定的信息。自动化处理方面正在研究,从网页中提取信息,我觉得网上某些网友用String/StringBuilder来处理的方法不可取,用“正则表达式”无疑是最好的。尽管“正则表达式”不容易书写,但查一查资料,还是不难的。
    以下是我写的一个从网页中抓取EMail的方法,可以处理带分页的link。用这个程序,我一下子从一个网页中提取到3000多个EMail(哈哈,发垃圾邮件的人是不是也这样做的??)
 1       //CAll
 2        private void GetAllURL(string urlStr)
 3        {
 4            new Thread(new ParameterizedThreadStart(GetEmailAddress)).Start(urlStr);  
                 ...    //处理页面中的Link 
                }

 5        /**//// <summary>
 6        /// 提取网页中的Eamil
 7        /// </summary>
 8        /// <param name="urlStr">网页地址</param>

 9        private void GetEmailAddress(object urlStr)
10        {
11            ArrayList EmailStrs = GetWebInfo((string)urlStr, @"(?<EmailStr>\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b)");   //得到Email
12            foreach (object tmp in EmailStrs)
13            {
14                Invoke(new AppendTextDelegate(AppendText), new object[] { tmp + "\r\n" });
15            }

16        }

17  
18        private ArrayList GetWebInfo(string URlStr,string RegExpress)
19        {
20            //打开指定页
21            HttpWebRequest webRequest1 = (HttpWebRequest)WebRequest.Create(new Uri(URlStr));
22            webRequest1.Method = "GET";
23            HttpWebResponse response = (HttpWebResponse)webRequest1.GetResponse();
24            String textData = new StreamReader(response.GetResponseStream(), Encoding.Default).ReadToEnd();
25
26
27            //用正则表达式,提取指定内容,带一个变量
28            Regex r;
29            Match m;
30            r = new Regex(RegExpress,   //@"copyTitle.\'(?<AdInfo>.*)\'",
31                RegexOptions.IgnoreCase | RegexOptions.Compiled);
32            int pos1=RegExpress.IndexOf("(?<");
33            int pos2=RegExpress.IndexOf(">",pos1);
34            string DestionKey = RegExpress.Substring(pos1 + 3, pos2 - pos1 - 3);
35            string  AdStr = "";
36            ArrayList Result = new ArrayList();
37            for (m = r.Match(textData); m.Success; m = m.NextMatch())
38            {
39                AdStr = m.Result("${" + DestionKey + "}").Trim();   //地址
40                Result.Add(AdStr);
41            }

42            return Result;
43        }

44

上述代码中的关键是书写提取EMail的表达式:
               @"(?<EmailStr>\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b)"
以下是我写的一个程序界面及运行结果:


转载于:https://www.cnblogs.com/yuanbao/archive/2007/10/19/929914.html

### 使用正则表达式提取数据的方法 #### 正则表达式的概念与用途 正则表达式是一种强大的文本处理工具,广泛应用于编程语言中以匹配、搜索、替换和解析字符串。它定义了字符串的搜索模式,能够实现对复杂文本数据的精确提取[^2]。 #### 提取具体格式的数据实例——HTML标签内容 对于C#开发而言,如果目标是从网页源码里获取指定HTML标签内的文字,则可构建相应的正则表达式来进行操作。比如要抓取`<title>`标签间的内容,可以采用如下方式: ```csharp using System; using System.Text.RegularExpressions; class Program { static void Main() { string htmlContent = "<html><head><title>Example Website</title></head><body>Hello world!</body></html>"; Regex regexTitleTag = new Regex(@"(?<=<title>).*(?=</title>)"); Match matchResult = regexTitleTag.Match(htmlContent); Console.WriteLine(matchResult.Value); // 输出:Example Website } } ``` 上述代码片段展示了如何利用正则表达式捕获位于两个特定标记之间的任意长度字符序列。这里使用的语法结构是“零宽断言”,即不消耗任何输入字符而仅当满足条件时才成功匹配的位置测试。其中,“`(?<=...)`”表示向后看肯定型环视(Positive Lookbehind),意味着左侧部分必须存在但不会成为最终匹配结果的一部分;同理,“`(?=...)`”代表向前看肯定型环视(Positive Lookahead)。因此整个表达式意指找到紧随`<title>`之后且紧接着`</title>`之前的所有字符[^1]。 #### 构建更复杂的模式 为了应对更加多样化的场景需求,可以通过连续拼接不同的子模式来形成更为精细复杂的整体模式。例如,在某些情况下可能希望定位到那些严格紧跟某个关键词后面的数字串,此时就可以设计这样的正则表达式:“`\bword\s+(\d+)`”。这里的特殊符号含义分别为:单词边界(`\b`)、空白符(`\s`)以及一位或多于一位数位组成的集合(`(\d+)`)[^3]。 #### Python re模块下的实践应用 Python内置有专门用来支持正则运算的标准库——re模块。借助该模块提供的接口函数如findall(), sub()等,开发者能轻松完成诸如批量查找符合条件项或者按照既定规则修改原始字符串的任务。下面给出一段简单的演示程序,旨在示范怎样运用正则技术从给定文本集中筛选出所有的电子邮件地址: ```python import re text_with_emails = """ Contact us at support@example.com or sales@company.org. For more information, visit our website http://www.example.net/. """ email_pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+" matches = re.findall(email_pattern, text_with_emails) print(matches) # ['support@example.com', 'sales@company.org'] ``` 此段脚本首先声明了一条遵循常见邮箱账号命名习惯的广义化模板作为参数传递给了findall方法调用,后者负责遍历传入的目标字符串并返回所有符合设定特征的对象列表[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值