?? 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 + -