文章采集程序(字符处理规则重构处理应该算是采集的处理方式!)

优采云 发布时间: 2022-02-07 18:09

  文章采集程序(字符处理规则重构处理应该算是采集的处理方式!)

  之前因为工作原因,写了一个通用网站data采集的小工具,通过配置XML到采集不同网站内容。在这段工作的业余时间,觉得有必要对其进行改造,顺便学习学习,特此记录。字符处理规则重构字符处理应该算作采集

  强烈推荐IDEA2021.1.3破解激活,IntelliJ IDEA注册码,2021.1.3IDEA激活码

  大家好,我是建筑师,一个会写代码,会背诗的建筑师。今天就来说说通用采集小工具重构之路——字符处理规则重构,希望能帮助大家提高!!!

  之前因为工作原因,写了一个通用网站data采集的小工具,通过配置XML到采集不同网站内容。

  在这段工作的业余时间,觉得有必要对其进行改造,顺便学习学习,特此记录。

  字符处理规则重构

  字符处理应该被视为采集中的核心内容,如果从一大串HTML字符串中提取到我们需要的字段中。我们来看看之前的处理方式:

  

  

  查看代码

  string temp2;

temp2 = GetStr(str, MyConfig.Url, Lev); //字符截取规则

temp2 = ReplaceStr(temp2, MyConfig.UrlGL, Lev); //字符过滤规则

temp2 = SetCodeing(temp2, MyConfig.UrlBM, Lev);//字符URL编码规则

temp2 = Myreplace(temp2,MyConfig.UrlGvContent,Lev);//字符替换规则

  只听山间传来建筑师的声音:

  东山乡只用了不到一年的时间,就回到了种植春田。谁将向上或向下匹配?

  故障排除:

  1. 客户端调用次数过多,如果有四个规则,则需要调用四个规则。

  2. 扩展不灵活。如果以后遇到新的采集要求,现有的规则不满足要求,需要增加新的规则,不符合“开闭原则”

  让我们开始重构:

  1. 提取通用规则接口

  

  

  文字处理规则界面

  此代码由Java架构师必看网-架构君整理

///

/// 文字处理规则接口

///

public interface ItextRule

{

///

/// 字符处理

///

/// 待处理字符串

/// 配置关键字

/// 当前层级

///

string TextPro(string sourceStr,string key,int lev);

}

  2. 为规则类创建一个抽象类,并编写一些公共方法

  

  

  字符处理规则基类

   ///

/// 字符处理规则基础类

///

public abstract class TextRuleBase

{

private string myKey = string.Empty;

public TextRuleBase(string _key)

{

myKey = _key;

}

///

/// 获取配置文件的值

///

///

///

///

protected string[] GetValue(string key,int lev)

{

string str = string.Empty;

string temp = string.Empty;

string tempKey = key + myKey + lev;

bool Istrue = true;

while(Istrue) //循环读配置,知道为空

{

temp = SiteConfig.ConfigByKey(tempKey);

if (temp == "")

{

Istrue = false;

}

else

{

str += temp + "|";

tempKey += lev;

}

}

return str.Split(new char[]{'|'},StringSplitOptions.RemoveEmptyEntries);

}

///

/// 具体规则处理 强制子类实现

///

///

///

///

protected abstract string TextPro(string sourceStr, string[] Contents);

}

  3. 创建字符规则类,按照以上逻辑创建4个字符规则类,继承接口和抽象类

  

  

  字符截取规则基本规则

  这里仅创建一个示例,其他示例相同。或查看代码

  4. 建立高层接口供客户端直接调用,内部封装各种规则(根据配置)

  

  

  字符处理规则的高级接口

   ///

/// 字符处理规则的高层接口

///

public class TextRuleAll:ItextRule

{

private Dictionary ruleList = new Dictionary();

#region ItextRule 成员

public string TextPro(string sourceStr, string key, int lev)

{

string dicKey = key + lev;

string returnStr = string.Empty;

if (!ruleList.ContainsKey(dicKey))

{

IList list = new List();

#region 根据配置构建关键字规则列表

foreach (string vale in MyConfig.AllTextRules())

{

string[] temp = vale.Split('.');

string xmlKey = temp[temp.Length - 1];

if (xmlKey == "TextIntercept") //写死 字符截取规则为基本规则

xmlKey = "";

if (SiteConfig.ConfigByKey(key + xmlKey + lev) != "") //XML文件有此配置关键字

{

list.Add((ItextRule)Assembly.Load("Demo1").CreateInstance(vale));

}

}

#endregion

ruleList.Add(dicKey,list);

}

IList mylist = ruleList[dicKey];

if (mylist != null && mylist.Count > 0) //循环执行各种规则处理

{

returnStr = sourceStr;

foreach (ItextRule irule in mylist)

returnStr = irule.TextPro(returnStr, key, lev);

}

return returnStr;

}

#end

  5. 配置文件

  

  

  XML 配置

  

Collect.TextRule.TextIntercept,Collect.TextRule.StaticReplace,Collect.TextRule.TextUrlEncode,Collect.TextRule.TextFilter

邮件地址是[内容]

#,@

fuwentao,fwt

city=[内容]

.com,[内容]http

  重构完成,再来看看客户端的调用:

  string testStr = "我是fuwentao,我的邮件地址是fwt1314111#163.com,网址http://www.mywaysoft.net/city=上海";

TextRuleAll cmd = new TextRuleAll();

string rel= cmd.TextPro(testStr, "Name", 1); //结果

  只需一个 cmd.TextPro 即可获得它!是不是比以前简单了。

  而且,这种灵活性也很强。如果以后想增加新的处理规则,只需要创建一个规则类,然后在配置文件中进行配置。

  演示下载

  今天文章结束,感谢阅读,Java架构师必看,祝你升职加薪,年年好运。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线