最近在最数据采集工作,主要是从网页上采集数据,因此就用到了从页面提取数据的放。
同事由于大部分网站在翻页或提交的时候需要采用POST 的方式提交数据,附带写了一个简单的页面POST信息提取的方法
/// <summary>
/// 提供HTML页面代码处理方法的类
/// </summary>
public static class HtmlTreatment
{
/// <summary>
/// 获取HTML页面POST数据的静态方法
/// </summary>
/// <param name="htmlString">HTML字符串</param>
/// <param name="postDataTemplates">POST数据模板</param>
/// <returns>POST数据字符串</returns>
public static string GetPostData(string htmlString,PostDataRules postDataRules)
{
//声明局部变量
int i=0;
int j=0;
//声明用于存放POST数据值的数组
string[] postDataStrings = new string[postDataRules.Count];
string postDataString = string.Empty;
//得到POST数据的格式化字符串
for (int m = 0; m < postDataRules.Count; m++)
{
if (m == 0)
{
postDataString = postDataRules[m].PostDataName + "={" + m + "}";
}
else
{
postDataString += "&" + postDataRules[m].PostDataName + "={" + m + "}";
}
}
/
/逐个提取POST数据值
for (int m = 0; m < postDataRules.Count; m++)
{
string templatePrefix = postDataRules[m].TemplatePrefix;
string templateSuffix = postDataRules[m].TemplateSuffix;
//得到对应值的前后索引值
i = htmlString.IndexOf(templatePrefix, i) + templatePrefix.Length;
j = htmlString.IndexOf(templateSuffix, i);
//提取数据值并转换为URL编码格式
string tempString = htmlString.Substring(i, j - i);
tempString = HttpUtility.UrlEncode(tempString);
postDataStrings[m] = tempString;
}
//填充POST数据的数据值
postDataString = string.Format(postDataString, postDataStrings);
return postDataString;
}
/// <summary>
/// 从指定的HTML中提取从指定位置开始的指定模板之间的字符串
/// </summary>
/// <param name="startIndex">开始位置的索引</param>
/// <param name="htmlString">HTML字符串</param>
/
// <param name="templatePrefix">匹配的前模板</param>
/// <param name="templateSuffix">匹配的后模板</param>
/// <returns>匹配出字符串</returns>
public static string GetDataFromHtml(int startIndex, string htmlString, string templatePrefix, string templateSuffix,out int endIn
dex)
{
//定义局部变量
string dataString = string.Empty;
int i = 0;
int j = 0;
//获取起始位置及结束位置的索引
try
{
i = htmlString.IndexOf(templatePrefix, startIndex) + templatePrefix.Length;
j = htmlString.IndexOf(templateSuffix, i);
endIndex = j;
//提取数据
dataString = htmlString.Substring(i, j - i);
}
catch
{
endIndex = j;
dataString=string.Empty;
}
return dataString;
}
/// <summary>
/// 从指定的HTML中提取所有与模板匹配的字符串
/// </summary>
/// <param name="htmlString">HTML字符串</param>
/// <param name="dataTemplateString">匹配的数据模板</param>
/// <returns>匹配出字符串</returns>
public static string[] GetDataFromHtml(string htmlString, string dataTemplateString)
{
//定义局部变量
List<string> dataStringList = new List<string>();
Match match = Regex.Match(htmlString, dataTemplateString);
//循环匹配所有数据
while(match.Success)
{
dataStringList.Add(match.Value);
match = match.NextMatch();
}
string[] dataStrings = new string[dataStringList.Count];
/
/结果拷贝到数组中
dataStringList.CopyTo(dataStrings);
return dataStrings;
}
}
POST数据提取的模板
public class PostDataTemplate
{
//局部变量
private string _postDataName;
private string _templatePrefix;
private string _templateSuffix;
/// <summary>
/// POST数据名
/// </summary>
public string PostDataName
{
get { return _postDataName; }
}
/// <summary>
/// 前缀模板
/// </summary>
public string TemplatePrefix
{
get { return _templatePrefix; }
}
/// <summary>
/// 后缀模板
/// </summary>
public string TemplateSuffix
{
get { return _templateSuffix; }
}
/
// <summary>
/// 构造函数,构造一个经过初始化的模板类
param name/// </summary>
/// <param name="postDataName">POST数据名</param>
/// <param name="templatePrefix">前缀模板</param>
/// <param name="templateSuffix">后缀模板</param>
public PostDataTemplate(string postDataName, string templatePrefix, string templateSuffix)
{
//初始化参数
_postDataName = postDataName;
_templatePrefix = templatePrefix;
_t
emplateSuffix = templateSuffix;
}
}
POST数据模板集合
public class PostDataRules
{
private List<PostDataTemplate> _postDataRules = new List<PostDataTemplate>();
public int Count
{
get { return _postDataRules.Count; }
}
public PostDataTemplate this[int index]
{
get { return _postDataRules[index]; }
set { _postDataRules[index] = value; }
}
public void Add(PostDataTemplate postDataTemplate)
{
_postDataRules.Add(postDataTemplate);
}
public void Remove(PostDataTemplate postDataTemplate)
{
_postDataRules.Remove(postDataTemplate);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论