动态网页抓取(1.正则表达式匹配;2.使用HtmlAgilityPack;(不是很熟悉) )
优采云 发布时间: 2021-10-05 23:08动态网页抓取(1.正则表达式匹配;2.使用HtmlAgilityPack;(不是很熟悉)
)
等待。
此过程目前有两种方法可供选择:
1.正则表达式匹配;
2.使用HtmlAgilityPack;(不是很熟悉)
本文仅提供正则表达式的方法供大家学习借鉴,请各位读者见谅。
正则表达式定位
如果长期做数据采集工作,建议深入研究。这里是DeerChao对正则表达式的介绍,非常推荐。如果你只是想做一个课程设计,可以听我的介绍。
“定位”过程主要使用Regex.Match()方法,返回结果为正则匹配的文本。即目标网页数据。
让我粗略地解释一下,例如,如果您有这样的文字:
“我20岁了。”
我想获取年龄数据,即“20”,如何使用常规捕获?
//...
using System.Text.RegularExpressions;
//导入正则表达式命名空间
//...
string strTest = @"I am 20 years old.";
string strResult = "";
strResult = Regex.Match(strTest, @"\d+").Value;
Console.WriteLine(strResult);
Console.ReadKey();
OK,抓包成功!但是你可能会问,这个程序跟定位有什么关系?好吧,让我解释一下:
您可以多次使用它: strResult = Regex.Match(strResult, @"正正").Value; 一步一步缩小网页中的数据范围,最终定位到你想到的那部分数据。
类似于“我今年 20 岁”。您可以通过三步找到“20”
然后就可以在网页上用同样的方法定位嵌套的内容(当然,如果没有嵌套的部分,也可以尝试一次性全部抓取),
strResult = Regex.Match(strResult , "(?is)登录.*?更多").Value;
strResult = Regex.Match(strResult , "(?is)").Value;
通过这两行代码,就可以定位到百度的“百度点击”按钮。当然你也可以删掉上一句,因为百度首页只有一个提交按钮。但是如果是其他网站,有多个提交按钮,那么就得重新考虑正则的写法了。
常问问题
定位数据的原理基本介绍完毕。相信读者会有很多疑问(文笔不好,见谅),我自己写一些吧:
Q:匹配结果有多个值怎么办?
A:在匹配网页数据的时候,经常会遇到多个匹配的结果,比如多个表,多个div标签等,这时候我们可以使用Match采集来接受返回的结果集,例如:
Match采集 mcResult = Regex.Matches(strHtml, @”(?is)”);
可以使用foreach遍历这个集合,也可以使用下标来访问元素。但请注意,您需要使用 Regex.Matches() 方法而不是 Regex.Match() 方法。你注意到了吗?这表示您可能匹配了多个结果。
问:常规中的 (?is) 是什么意思?
A:这是正则表达式的匹配选项,.Net中也有对应的选项
(?i) 表示不区分大小写,相当于.net 中的 RegexOptions.IgnoreCase 选项;
(?s) 表示让“。” 匹配换行符,即“。” 表示 [\s\S] 相当于.net 中的 RegexOptions.Singleline 选项;
//当然还有其他问题,这里就不一一列举了,希望大家多多评论,我会尽量解答。
三、保存数据
保存数据的方式有很多种,比如XML格式、标签内容、直接写入数据库、保存为txt……您可以根据自己的需要选择合适的保存方式。
但是,为了统一,我建议使用 XML 来保存内容。首先,网页中的数据基本可以转换成XML格式;其次,将XML输入到数据库中并转换为其他形式非常方便;三、XML操作 数据方便。如果需要修改数据,有很多API库之类的可以调用。总之就是好处多多,呵呵。
@"Author: wushuai1346
Description: 不断完善中.版权所有,转载请注明出处,谢谢.
Copyright (C) 2011 wushuai1346,All Rights Reserved
Url: http://blog.csdn.net/wushuai1346/article/details/7108424
Createtime : 2011-12-28
Updatetime : 2011-12-29"