使用System.Text.RegularExpression中的API实现网页数据的抓取
2008-03-31 16:15
573 查看
今天朋友提出希望做一个程序可以从一张HTML网页上截取表格数据并导入数据库(点击此处查看目标页面)。在确认此网站并未提供任何开放的服务接口后,确定了从HTML页面代码抓取有效数据的方案,通过查阅相关资料,该方案主要通过两种途径实现:
途径A: 使用WebRequest, WebResponse获取HTML流,根据正则表达式判断并截取有效数据。
途径B: 使用WebBrowser创建一个HtmlDocument对象,然后使用类似DOM的方式操作HTML元素获取有效数据。
该网站提供的页面比较特殊,HTML元素均没有ID属性,故采用途径A实现。通过查阅相关资料,发现采用途径A实现主要包括如下几个步骤:
1. 使用WebRequest对象向目标URL发送请求,并使用WebResponse对象接受服务器返回的HTML流。
2. 使用StreamReader对象读取流中的字符串。
3. 分析HTML代码的特点并编写正则表达式,使用Regex类提供的方法根据正则表达式截取有效数据。
其中编写正确规范的正则表达式是重点和难点,在实验的过程中也是在这一步上花费了很大的精力,这里不对正则表达式的详细内容做赘述(关于正则表达式的使用,可以查看这篇资料文档)。本文将主要介绍Regex类及其方法。使用Regex类必须首先引用System.Text.RegularExpression命名空间,该类为我们提供了一些静态方法,在本例中用到的主要有:
1. Match: 将输入字符串与正则表达式进行一次比较,返回Match对象。
2. Matches: 将输入字符串与正则表达式进行比较,返回Match集合对象。
Match对象代表正则表达式在字符串中的一次匹配,其常用的几个属性为:
1. Value:获取匹配的字符串值,比如下面的代码:
1 string strDest = "<html><title>hello</title></html>";
2 string strReg = "<title>(\\w*)</title>";
3 Match mat = Regex.Match(strDest, strReg, RegexOptions.IgnoreCase);
4 // mat.Value应为<title>hello</title>
5 // mat.Index应为6
6 mat.Value =
7
2. Success: true/false, 指明匹配是否成功
3. Index: 匹配字符串在目标字符串中的起始位置,在上面的例子中,Index为0,即从字符串开始处发生匹配,如上例。
4. Group: 这是很重要的一个属性,尤其是在获取匹配的有效数据的时候,这个属性保存了匹配数据的集合,集合的0号元素值就是Match的Value属性值中的字符串,如果在正则表达式中对匹配的规则用小括号进行了包围,则匹配成功后在Groups中会自动增加该匹配项的值,例如下面的例子:
1 string strDest = "<html><title>hello</title></html>";
2 string strReg = "<title>\\w*</title>";
3 string strReg2 = "<title>(\\w*)</title>";
4 Match mat = Regex.Match(strDest, strReg, RegexOptions.IgnoreCase);
5 Match mat2 = Regex.Match(strDest, strReg2, RegexOptions.IgnoreCase);
6
7 // mat与mat2的Groups[0]都为<title>hello</title>
8 // mat的Groups[1]为空
9 // mat2的Groups[1]为hello
10 mat.Groups[0];
11 mat2.Groups[1];
12
介绍完上述主要概念,就可以方便的应用这些对象进行HTML的分析和挖掘数据工作。最后效果如图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/18/56ed029405b213c78f7805f3d60e911f.png)
总结
本文介绍了如何通过WebRequest/WebResponse对Web服务器发出请求并获取返回的HTML数据流,介绍了Regex, Match, MatchCollection等正则表达式操作中常用的对象,以及如何使用Regex或取出其中的有用信息。这是我第一次做正则表达式的实验,其间由于字符串操作而可能导致的运行效率问题都没有进行考虑,在后面的时间里会逐步完善。
下载源代码,源代码开发环境为VS2008.
途径A: 使用WebRequest, WebResponse获取HTML流,根据正则表达式判断并截取有效数据。
途径B: 使用WebBrowser创建一个HtmlDocument对象,然后使用类似DOM的方式操作HTML元素获取有效数据。
该网站提供的页面比较特殊,HTML元素均没有ID属性,故采用途径A实现。通过查阅相关资料,发现采用途径A实现主要包括如下几个步骤:
1. 使用WebRequest对象向目标URL发送请求,并使用WebResponse对象接受服务器返回的HTML流。
2. 使用StreamReader对象读取流中的字符串。
3. 分析HTML代码的特点并编写正则表达式,使用Regex类提供的方法根据正则表达式截取有效数据。
其中编写正确规范的正则表达式是重点和难点,在实验的过程中也是在这一步上花费了很大的精力,这里不对正则表达式的详细内容做赘述(关于正则表达式的使用,可以查看这篇资料文档)。本文将主要介绍Regex类及其方法。使用Regex类必须首先引用System.Text.RegularExpression命名空间,该类为我们提供了一些静态方法,在本例中用到的主要有:
1. Match: 将输入字符串与正则表达式进行一次比较,返回Match对象。
2. Matches: 将输入字符串与正则表达式进行比较,返回Match集合对象。
Match对象代表正则表达式在字符串中的一次匹配,其常用的几个属性为:
1. Value:获取匹配的字符串值,比如下面的代码:
1 string strDest = "<html><title>hello</title></html>";
2 string strReg = "<title>(\\w*)</title>";
3 Match mat = Regex.Match(strDest, strReg, RegexOptions.IgnoreCase);
4 // mat.Value应为<title>hello</title>
5 // mat.Index应为6
6 mat.Value =
7
2. Success: true/false, 指明匹配是否成功
3. Index: 匹配字符串在目标字符串中的起始位置,在上面的例子中,Index为0,即从字符串开始处发生匹配,如上例。
4. Group: 这是很重要的一个属性,尤其是在获取匹配的有效数据的时候,这个属性保存了匹配数据的集合,集合的0号元素值就是Match的Value属性值中的字符串,如果在正则表达式中对匹配的规则用小括号进行了包围,则匹配成功后在Groups中会自动增加该匹配项的值,例如下面的例子:
1 string strDest = "<html><title>hello</title></html>";
2 string strReg = "<title>\\w*</title>";
3 string strReg2 = "<title>(\\w*)</title>";
4 Match mat = Regex.Match(strDest, strReg, RegexOptions.IgnoreCase);
5 Match mat2 = Regex.Match(strDest, strReg2, RegexOptions.IgnoreCase);
6
7 // mat与mat2的Groups[0]都为<title>hello</title>
8 // mat的Groups[1]为空
9 // mat2的Groups[1]为hello
10 mat.Groups[0];
11 mat2.Groups[1];
12
介绍完上述主要概念,就可以方便的应用这些对象进行HTML的分析和挖掘数据工作。最后效果如图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/18/56ed029405b213c78f7805f3d60e911f.png)
总结
本文介绍了如何通过WebRequest/WebResponse对Web服务器发出请求并获取返回的HTML数据流,介绍了Regex, Match, MatchCollection等正则表达式操作中常用的对象,以及如何使用Regex或取出其中的有用信息。这是我第一次做正则表达式的实验,其间由于字符串操作而可能导致的运行效率问题都没有进行考虑,在后面的时间里会逐步完善。
下载源代码,源代码开发环境为VS2008.
相关文章推荐
- 使用System.Text.RegularExpression中的API实现网页数据的抓取
- 使用System.Text.RegularExpression中的API实现网页数据的抓取
- ODBC API 使用SQLPutData实现SQL数据库BLOB(TEXT、IMAGE类型字段)数据提交[原创](一)
- ODBC API 使用SQLPutData实现SQL数据库BLOB(TEXT、IMAGE类型字段)数据提交[原创](二)
- C#使用Selenium实现QQ空间数据抓取 登录QQ空间
- 使用Maven构建项目环境,利用Jsoup实现数据抓取(上)
- 使用HtmlAgilityPack抓取网页数据
- 使用HtmlAgilityPack批量抓取网页数据
- 使用PHP进行网页数据抓取小结
- 利用iframe实现ajax跨域请求,抓取网页中ajax数据
- Jsoup简介——使用Java抓取网页数据
- C#System.Text.RegularExpressions.Regex使用(二) .
- 实现从网页上抓取数据(htmlparser)
- Asp使用XMLHTTP方式上实现数据抓取!
- HBase 使用 Java Api 实现对数据的增删改查
- 使用java开源工具jsoup抓取解析网页数据
- 使用job自动抓取网页数据发送邮件,以springboot服务启动
- Python中使用PhantomJS抓取Javascript网页数据
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 使用Expression实现数据的任意字段过滤(1)