📄 itemparser.java
字号:
/*
* *****************************************************
* Copyright (c) 2005 IIM Lab. All Rights Reserved.
* Created by xuehao at 2005-10-12
* Contact: zxuehao@mail.ustc.edu.cn
* *****************************************************
*/
package org.indigo.parser;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.apache.commons.httpclient.NameValuePair;
import org.indigo.filters.FiltEnter;
import org.indigo.filters.FiltFirstColon;
import org.indigo.filters.FiltFrontBack;
import org.indigo.filters.FiltGtLt;
import org.indigo.filters.FiltSpace;
import org.indigo.filters.FiltUntil;
import org.indigo.filters.Filter;
import org.indigo.xml.FiltPair;
/**
* 此类主要完成对所采集到的一条数据的封装。
* @author wbz
*
*/
public class ItemParser
{
protected ArrayList itsPairs=null;
private boolean itsFilterFlag=true;
private String itsUrl;
public static final String GAP_TOKEN="`";
private Parser itsParser=null;
private Filter [] filters = null;
private String emailUrl="http://www.damabang.com/buyandsale/";
public int errorMark=0;
public String errorField=null;
public boolean IsByPost=false;
public String formUrl;
public NameValuePair data[]=null;
private Hashtable<String, String> defaultValue=null;
/**
* 无参构造函数,主要完成对于一条数据中的每个数据项的过滤。
*
*/
public ItemParser()
{
filters = new Filter[6];
filters[0] = new FiltUntil( ">" );
filters[1] = new FiltFrontBack();
filters[2] = new FiltSpace();
filters[3] = new FiltEnter();
filters[4] = new FiltFirstColon();
filters[5] = new FiltGtLt();
defaultValue=new Hashtable<String, String>();
}
public ItemParser(String s)
{
}
/**
* 当采集时需要动态默认值时,用到此方法。
* @param name
* @param value
*/
public void setDefaultValue(String name,String value)
{
defaultValue.put(name, value);
}
/**
* 清除存放在table中所有值。
*
*/
public void clearTable()
{
defaultValue.clear();
}
/**
* 设置解析器。
* @param parser
*/
public void setParser( Parser parser )
{
itsParser = parser;
}
/**
* 设置是否需要登陆。
* @param IsByLogin
*/
public void setIsByLogin(boolean IsByLogin)
{
itsParser.setIsByLogin(IsByLogin);
}
/**
* 设置是否通过post方法登陆。
* @param IsByPost
*/
public void setIsByPost(boolean IsByPost)
{
itsParser.setIsByPost(IsByPost);
}
/**
* 当采集中遇到js时,可以通过此方法设置参数值。
* @param data
*/
public void setValuePair(NameValuePair data[])
{
itsParser.setJSValuePairs(data);
}
public void setEncoding(String encoding)
{
return;
}
/**
* add by wbz for useful information;
* @param startStr
* @param endStr
*/
/**
* 设置采集的前后标识字符串。
*/
public void setItsPageStr(String startStr, String endStr)
{
itsParser.setItsPageStr(startStr, endStr);
}
/**
* 当需要登陆或采集中遇到表单时,设置处理页面。
* @param url
*/
public void setFromUrl(String url)
{
formUrl=url;
itsParser.setFromUrl(url);
}
/**
* 设置采集页面的URL。
* @param url
*/
public void setUrl( String url )
{
itsUrl = url;
itsParser.setUrl( url );
}
/**
* 此方法完成了主要的采集工作,
* 首先是读取采集规则,然后把采集规则应用到实际的网页源代码中,抽取其中的信息。
* @return
*/
public String getAItem()
{
int sz=itsPairs.size();
String str = "", startStr, endStr, tmpstr=null,isRegex=null,defaultValue=null;
String isVarDef=null;
String varDefName=null;
int p;
FiltPair pair=null;
FiltPair temp=null;
int parent=-1;
int iii=-1;
for( int i=0; i<sz; i++ )
{
pair = (FiltPair) itsPairs.get( i );
p=pair.getPp();
if(p!=-1)
{
parent=p;
iii=i;
}
}
/**
* 循环读取抽取规则,根据抽取规则的前后标识提取中间信息。
*/
for( int i=0; i<sz; i++ )
{
pair = (FiltPair) itsPairs.get( i );
startStr = pair.getStart();
endStr = pair.getEnd();
isRegex=pair.getIsRegex();
defaultValue=pair.getDefaultValue();
varDefName=pair.getVarDefaultName();
isVarDef=pair.getIsVarDefault();
p=pair.getPp();
if(i==iii)
continue;
/**
* modified by wbz for Regex;
*/
if(isRegex!=null&&isRegex.trim().equals("true"))
tmpstr=itsParser.parserWithRegex(startStr, endStr);//当采集规则中用到正则表达式时。
else if(isVarDef!=null&&isVarDef.trim().equalsIgnoreCase("true"))//当采集时需要动态默认值时。
{
tmpstr=this.defaultValue.get(varDefName);
if(tmpstr==null)
{
tmpstr=itsParser.parseWith(startStr, endStr);
this.defaultValue.put(varDefName, tmpstr);
}
//this.defaultValue.remove(varDefaultValue);
}
else// added by wbz for defaultValue;当采集中用到静态默认值时。
{
if(defaultValue==null)
tmpstr = itsParser.parseWith( startStr, endStr );
else
{
if(defaultValue.indexOf("###")!=-1)
{
tmpstr = itsParser.parseWith( startStr, endStr );
if(tmpstr!=null)
tmpstr=defaultValue.replaceAll("###", tmpstr);
}else
tmpstr=defaultValue;
}
}
// if(p==-1&&parent==i)
// {
// temp = (FiltPair) itsPairs.get( iii );
// }
if( tmpstr==null&&p==-1 )//判断采集时是否遇到错误。
{
if(errorMark>=0&&errorMark<sz)//判断出错位置。
{
errorField=startStr+" and "+endStr+" 出错";
errorMark=i+1;
}
return null;
}
String backup=null;
backup = tmpstr;
String email=null;
/**
* modified by wbz
* 当需要进入第三级链接时,执行下面的语句。
* 从第三级页面中获得所需信息。
*/
if( p==-1&&parent==i)
{
temp = (FiltPair) itsPairs.get( iii );
String begin,end;
begin = temp.getStart();
end =temp.getEnd();
int ii,jj;
ii = tmpstr.indexOf( begin );
jj = tmpstr.indexOf( end, ii+begin.length() );
String thirdurl = null;
thirdurl = tmpstr.substring( ii+begin.length(), jj );
thirdurl = emailUrl + thirdurl;
// System.out.println( thirdurl );
Parser parser = new Parser();
parser.setUrl( thirdurl );
String pageStr = null;
// parser.open();
pageStr = parser.parseAll();
String beginemail, endemail;
beginemail =temp.getPair().getItsStart();
endemail = temp.getPair().getItsEnd();
email = parser.parseWith( beginemail, endemail );
// System.out.println( email );
tmpstr = email;
if( itsFilterFlag &&tmpstr!=null)
tmpstr = filt( tmpstr );
// ii = str.lastIndexOf( "`", str.length() );
// ii = str.lastIndexOf( "`", ii-1 );
// str = str.substring( 0, ii );
// str += ItemParser.GAP_TOKEN;
// str += ItemParser.GAP_TOKEN;
}
tmpstr = backup;
tmpstr.replaceAll("`", "");
if( itsFilterFlag )//过滤一些标签。
tmpstr = filt( tmpstr );
str += tmpstr.trim();
if(email!=null)
{str += ItemParser.GAP_TOKEN;
str += email;}
str += ItemParser.GAP_TOKEN;
}
//把采集到的每个字段组成字符串通过`分隔。
str = str.substring( 0, str.length()-1 );
str = str.trim()+ItemParser.GAP_TOKEN+itsUrl;
// System.out.println( str );
return str;
}
/**
* 设置此次任务的采集规则。
* @param list
*/
public void setPairList( ArrayList list )
{
itsPairs = list;
}
/**
* 打开和指定页面的链接。
* @return
*/
public boolean open()
{
return itsParser.open();
}
/**
* 关闭和指定页面建立的流。
*
*/
public void close()
{
itsParser.close();
}
/**
* 把指定的字符串过滤。
* @param str
* @return
*/
public String filt( String str )
{
int tmpsz,j;
tmpsz = filters.length;
for( j=0; j<tmpsz; j++ )
str = filters[j].filt( str );
return str;
}
/**
* 设置是否需要过滤参数。
* @param f
*/
public void setFilterFlag(boolean f)
{
itsFilterFlag = f;
}
// add by wbz
/**
* 获取错误标记。
*/
public int getErrorMark() {
return errorMark;
}
// add by wbz
/**
* 获取错误字段。
*/
public String getErrorField() {
return errorField;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -