文章采集程序(字符处理规则重构处理应该算是采集的处理方式!)
优采云 发布时间: 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架构师必看,祝你升职加薪,年年好运。