HTMLから特定の部分を切り出す

戻る
出力結果のXML

■デバック情報

---クレンジング前(行番号=0)---
[0-0] <BR>
[0-1] <FONT SIZE="-1"><SPAN CLASS="size2">商品番号</SPAN></FONT>
[0-2] <FONT SIZE="-1"><SPAN CLASS="size2">内容量</SPAN></FONT>
[0-3] <FONT SIZE="-1"><SPAN CLASS="size2">税込価格(本体価格)</SPAN></FONT>
[0-4] <BR>
[0-5] <BR>
[0-6] <BR>

---クレンジング前(行番号=1)---
[1-0] <BR>
[1-1] 6565-10
[1-2] 3.5g×10本
[1-3] 893円 <FONT SIZE="-1"><SPAN CLASS="size2">(850円)</SPAN></FONT>
[1-4] <A href="/Cart/AddCart?item_id=6565-10&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A>
[1-5] <A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565-10&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A>
[1-6] <A HREF="/Seibun/Beauty?item_id=6565-10&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A>

---クレンジング前(行番号=2)---
[2-0] <IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0" WIDTH="36" HEIGHT="36">
[2-1] 6565-03
[2-2] 徳用タイプ<br>1箱(30本)×3個
[2-3] 6,930円 <FONT SIZE="-1"><SPAN CLASS="size2">(6,600円)</SPAN></FONT>
[2-4] <A href="/Cart/AddCart?item_id=6565-03&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A>
[2-5] <A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565-03&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A>
[2-6] <A HREF="/Seibun/Beauty?item_id=6565-03&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A>

---クレンジング前(行番号=3)---
[3-0] <IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0" WIDTH="36" HEIGHT="36">
[3-1] 6565
[3-2] 3.5g×30本
[3-3] 2,573円 <FONT SIZE="-1"><SPAN CLASS="size2">(2,450円)</SPAN></FONT>
[3-4] <A href="/Cart/AddCart?item_id=6565&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A>
[3-5] <A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A>
[3-6] <A HREF="/Seibun/Beauty?item_id=6565&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A>

【処理結果】
[0-0] 
[0-1] 商品番号
[0-2] 内容量
[0-3] 税込価格(本体価格)
[0-4] 
[0-5] 
[0-6] 

[1-0] 
[1-1] 6565-10
[1-2] 3.5g×10本
[1-3] 893円 (850円)
[1-4] 
[1-5] 
[1-6] 

[2-0] 
[2-1] 6565-03
[2-2] 徳用タイプ1箱(30本)×3個
[2-3] 6,930円 (6,600円)
[2-4] 
[2-5] 
[2-6] 

[3-0] 
[3-1] 6565
[3-2] 3.5g×30本
[3-3] 2,573円 (2,450円)
[3-4] 
[3-5] 
[3-6] 

■取得したXML

<?xml version="1.0" encoding="Shift_JIS" ?>
<data>
<title>
商品詳細|健康食品|ファンファンファンオンライン
</title>
<itemlist>
<item row="1">
	<商品番号>
	6565-10
	</商品番号>
	<内容量>
	3.5g×10本
	</内容量>
	<税込価格-本体価格->
	893円 (850円)
	</税込価格-本体価格->
</item>
<item row="2">
	<商品番号>
	6565-03
	</商品番号>
	<内容量>
	徳用タイプ1箱(30本)×3個
	</内容量>
	<税込価格-本体価格->
	6,930円 (6,600円)
	</税込価格-本体価格->
</item>
<item row="3">
	<商品番号>
	6565
	</商品番号>
	<内容量>
	3.5g×30本
	</内容量>
	<税込価格-本体価格->
	2,573円 (2,450円)
	</税込価格-本体価格->
</item>
</itemlist>
</data>


■設定ファイル

# テーブルの部分
itemlist:	<!--商品テーブル Type1-->\n.*?\n(.*?)<!--/商品テーブル Type1-->
itemlist/header: 0
# タイトルの部分
title: <title>(.*?)</title>



■ソースプログラム

import java.io.*;
import java.net.*;
import java.util.regex.*;

/**
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class Cleanser {

    private String str = null;

    public Cleanser( String str ) {
        this.str = str;
    }

    public String cleanse() throws Exception {

        StringBuffer sb = new StringBuffer();

        try {

            StringReader sr = new StringReader( str );

            boolean processingText = true;
            int c;
            while ( ( c = sr.read() ) != -1 ) {
                if ( c == '<' ) {
                    /* ここからは読まない */
                    processingText = false;
                    continue;
                }
                if ( c == '>' ) {
                    /* この後から読む */
                    processingText = true;
                    continue;
                }
                if ( processingText ) {
                    // System.out.print((char)c);
                    sb.append( ( char ) c ); // そのままでcをセットすると数字が出てくるよ!
                }
            }

            sr.close();

        } catch ( IOException e ) {
            throw( e );
        }

        return sb.toString();

    }

    public static void main( String[] args ) throws Exception {

        Cleanser cleanser = new Cleanser( "<a name='uuu'>あいうえお</a>   <table>テーブル</table>...." );
        System.out.println( cleanser.cleanse() );

    }
}



import java.io.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
シェルやPERLあるいはプロパティファイルのコメントの部分を削除する
</pre>
@author KISHI Yasuhiro
*/

public class CommentEraser {

    static String erase( String line ) throws Exception {
        StringReader sr = new StringReader( line );
        StringBuffer sb = new StringBuffer();
        int c;
        while ( ( c = sr.read() ) != -1 ) {
            if ( c == '#' )
                break;
            sb.append( ( char ) c );
        }

        return sb.toString();
    }

    static public void main( String[] args ) {
        try {
            System.out.println( CommentEraser.erase( "............#.........." ) );
            System.out.println( CommentEraser.erase( "あいうえお" ) );
            System.out.println( CommentEraser.erase( "#あいうえお" ) );

        } catch ( Exception e ) {
            e.printStackTrace();
        }

    }

}


import java.io.*;
import java.util.*;
import java.util.regex.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
設定ファイルの内容から、タグ名と正規表現の記述を読み取る
</pre>
 
@author KISHI Yasuhiro
*/

public class ConfReader {

    /** 部分を切り出すための正規表現を記述したMAP */
    private HashMap regexHashMap = new HashMap();

    /** テーブル内のヘッダーの位置を格納するMAP */
    private HashMap headerHashMap = new HashMap();

    /** タグ名に対する正規表現を記述したHashMapを返す
    @return タグ名に対する正規表現を記述したHashMap
    */
    public HashMap getRegexHashMap() {
        return regexHashMap;
    }

    public HashMap getHeaderHashMap() {
        return headerHashMap;
    }

    /** 設定ファイルを読み取る
    @param conf 設定ファイル
    */
    public void read( String conf ) throws Exception {

        BufferedReader br = new BufferedReader( new FileReader( conf ) );

        String line = null;
        while ( ( line = br.readLine() ) != null ) {

            // コメントの処理
            line = CommentEraser.erase( line );

            // 空行は読み飛ばす
            if ( line.matches( "^$" ) ) {
                continue;
            }

            String[] arr = new String[ 2 ];
            arr = parseConf( line );

        }

        br.close();

    }

    /** ": "でセパレートされたキーと値を求める
    @param line 入力行		
    @return 結果の配列
    */
    private String[] parseConf( String line ) throws Exception {
        String[] arr = new String[ 2 ];

        //最初に見つかった": "の部分の位置を取得する
        int pos = line.indexOf( ":" );
        if ( pos < 0 ) {
            throw new ConfReaderParseException( "不正な記述です。 -- line = " + line + " " );
        }

        arr[ 0 ] = line.substring( 0, pos );
        arr[ 1 ] = line.substring( pos + 1, line.length() );
        // 前後の空白を削除
        arr[ 1 ] = arr[ 1 ].trim();

        if ( arr[ 0 ].matches( "^.+/header$" ) ) {
            // "要素名/header"の形式の場合
            String[] token = new String[ 2 ];
            token = arr[ 0 ].split( "/" );

            headerHashMap.put( token[ 0 ], arr[ 1 ] );

        } else {
            regexHashMap.put( arr[ 0 ], arr[ 1 ] );
        }

        return arr;
    }

    /** 単体試験用のメインメソッド */
    public static void main( String[] args ) {

        try {
            ConfReader cr = new ConfReader();
            cr.read( "ta.conf" );

            HashMap regexHashMap = cr.getRegexHashMap();
            HashMap headerHashMap = cr.getHeaderHashMap();

            Iterator iterator = regexHashMap.keySet().iterator();
            while ( iterator.hasNext() ) {
                String key = ( String ) iterator.next();
                String regex = ( String ) regexHashMap.get( key );

                System.out.println( key + " -- /" + regex + "/" );
                if ( headerHashMap.containsKey( key ) ) {
                    System.out.println( "\tヘッダの位置は、" + headerHashMap.get( key ) + " です" );
                }
            }

        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}




/**
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class ConfReaderParseException extends Exception {

    ConfReaderParseException( ) {}

    ConfReaderParseException( String errmsg ) {
        super( "(" + errmsg + ")" );
    }

    ConfReaderParseException( String errmsg, Throwable cause ) {
        super( "(" + errmsg + ")" , cause );
    }

    ConfReaderParseException( Throwable cause ) {
        super( cause );
    }
}





import java.io.*;
import java.util.*;
import java.util.regex.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
</pre>
 
@author KISHI Yasuhiro
*/

public class MatrixContainer {

    /** TABLEの内部 */
    private String segment = null;

    /** 行のイメージを格納するリスト */
    private List rows = new ArrayList();

    public List getRows() {
        return rows;
    }

    public MatrixContainer( String segment ) throws Exception {
        this.segment = segment;

        // 分解処理実行
        processLines();
    }

    /** TRタグ単位で処理していく */
    private void processLines() throws Exception {

        String regex = "<TR.*?>(.*?)</TR>";
        Pattern p = Pattern.compile( regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); // PERL正規表現オプション si と等価
        Matcher m = p.matcher( segment );

        int count = 0;
        while ( m.find() ) {
            String line = m.group( 1 );
            // System.out.println(count + ": " + line );

            // TDあるいはTHタグで囲まれ部分を取り出す
            ArrayList cols = processSingleLine( line );

            System.err.println( "---クレンジング前(行番号=" + count + ")---" );
            for ( int i = 0;i < cols.size();i++ ) {
                System.err.println( "[" + count + "-" + i + "] " + cols.get( i ) );
            }
            System.err.println();

            // クレンジング
            ArrayList cleansedList = cleanse( cols );
            cleanse( cols );

            rows.add( cleansedList );

            count++;
        }

    }

    /** TD|THタグ単位で分解してリストにセットする
    @param line 行
    @return TD|THタグ単位で分解したリスト( TH未対応 )
    */
    private ArrayList processSingleLine( String line ) {

        ArrayList cols = new ArrayList();

        String regex = "<TD.*?>(.*?)</TD>";
        Pattern p = Pattern.compile( regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); // PERL正規表現オプション si と等価
        Matcher m = p.matcher( line );

        int colNum = 0;
        while ( m.find() ) {
            String col = m.group( 1 );
            cols.add( col );
            colNum ++;
        }

        return cols;
    }

    /** クレンジングする */
    private ArrayList cleanse( ArrayList cols ) throws Exception {
        ArrayList cleansedList = new ArrayList();

        for ( int i = 0;i < cols.size();i++ ) {
            String src = ( String ) cols.get( i );

            Cleanser cleanser = new Cleanser( src );
            src = cleanser.cleanse();

            cleansedList.add( src );
        }

        return cleansedList;
    }
}





import java.io.*;
import java.util.*;

/**
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class MatrixSerializer {

    private final String ITEM = "item";

    private MatrixContainer mc = null;

    public MatrixSerializer( MatrixContainer mc ) {
        this.mc = mc;
    }

    /** ダンプする */
    public void dump() {

        ArrayList rows = ( ArrayList ) mc.getRows();

        // 内容のダンプ -- DEBUG用
        System.err.println( "【処理結果】" );
        for ( int i = 0;i < rows.size();i++ ) {
            ArrayList cols = ( ArrayList ) rows.get( i );
            for ( int j = 0;j < cols.size();j++ ) {
                System.err.println( "[" + i + "-" + j + "] " + cols.get( j ) );
            }
            System.err.println();
        }
    }

    /** XML形式で出力
    @param ヘッダが存在する行番号
    */
    public void serialize( String tagName, int rowNumOfHeader ) {
        /** 表示可能なカラム番号と要素名 */
        TreeMap availableCols = new TreeMap();

        ArrayList rows = ( ArrayList ) mc.getRows();

        ArrayList headerCols = ( ArrayList ) rows.get( rowNumOfHeader );
        for ( int i = 0;i < headerCols.size();i++ ) {
            String col = ( String ) headerCols.get( i );
            if ( !col.matches( "^\\s*$" ) ) {
                // 空白でなければ表示すべき列である
                // System.out.println(i + ": " + col);

                availableCols.put( new Integer( i ), col );
            }
        }

        // ヘッダの次の行から出力していく
        int rowNum = 1;
        System.out.println( "<" + tagName + ">" );
        for ( int i = rowNumOfHeader + 1;i < rows.size();i++ ) {
            ArrayList cols = ( ArrayList ) rows.get( i );
            System.out.println( "<" + ITEM + " row=\"" + rowNum + "\">" );

            for ( int j = 0;j < cols.size();j++ ) {
                Integer key = new Integer( j );
                if ( availableCols.containsKey( key ) ) {
                    String elementName = ( String ) availableCols.get( key );
                    String value = ( String ) cols.get( j );

                    elementName = sanitateElementName( elementName );

                    System.out.println( "\t" + "<" + elementName + ">" );
                    System.out.println( "\t" + value );
                    System.out.println( "\t" + "</" + elementName + ">" );
                }

            }
            System.out.println( "</" + ITEM + ">" );
            rowNum++;
        }
        System.out.println( "</" + tagName + ">" );

    }

    /** 要素名の中に含まれる不正な文字の置換
    @param elementName 要素名
    @return 処理結果
    */
    private String sanitateElementName( String elementName ) {
        // あとで文字参照にしてしまうこと!
        // なぜか ( or ) が要素名に混入しているとIEで表示できないので当座の対応
        // まずはとりあえず'('または')'は、'-'に変換しておく
        String result = elementName.replace( '(', '-' );
        result = result.replace( ')', '-' );

        return result;
    }
}





import java.io.*;
import java.util.*;
import java.util.regex.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
</pre>
 
@author KISHI Yasuhiro
*/

public class SegmentExtractor {
    private String regex;
    private StringBuffer content;

    public SegmentExtractor( String regex, StringBuffer content ) {
        this.regex = regex;
        this.content = content;
    }

    public String extract() {

        String result = null;

        Pattern p = Pattern.compile( regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); // PERL正規表現オプション si と等価
        Matcher m = p.matcher( content );
        if ( m.find() ) {
            result = m.group( 1 );
        }

        return result;
    }



}






import java.io.*;
import java.util.*;
import java.util.regex.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
</pre>
 
@author KISHI Yasuhiro
*/

public class SourceReader {

    /** ファイルの内容 */
    private StringBuffer content = null;

    /** 内容を返す
    @return 内容
    */
    public StringBuffer getContent() {
        return content;
    }

    /** ファイルの内容を読み込み、バッファにせっとする
    @param source 処理すべきHTMLファイルのPATH
    */
    public void read( String source ) throws Exception {

        BufferedReader br = new BufferedReader( new FileReader( source ) );

        String line = null;
        while ( ( line = br.readLine() ) != null ) {
            if ( content == null ) {
                content = new StringBuffer();
            }
            content.append( line + "\n" );
        }

        br.close();
    }

}




import java.io.*;
import java.util.*;
import java.util.regex.*;

/**
<pre>
$Id: ta.html,v 1.1 2009/06/22 16:12:28 kishi Exp kishi $
テーブル内の要素を読み込み、分解し、XML形式で吐き出す
</pre>
 
@author KISHI Yasuhiro
*/

public class TableAnalyzer {

    /** XML出力時のルート要素名 */
    private final String rootElementName = "data";

    /** 設定ファイル、HTMLのファイルを読み込み、処理する
    @param conf 設定ファイル
    @param source HTMLファイル
    */
    public void doProcess( String conf, String source ) throws Exception {

        try {
            // confファイルを読み込む(タグ名と正規表現を得る)
            ConfReader cr = new ConfReader();
            cr.read( conf );
            HashMap regexHashMap = cr.getRegexHashMap();
            // ヘッダ部分の行番号を求めるためのHashMap
            HashMap headerHashMap = cr.getHeaderHashMap();

            // HTMLファイルを読み込む
            SourceReader sr = new SourceReader();
            sr.read( source );
            StringBuffer content = sr.getContent();

            // システムのプロパティを得る
            Properties props = System.getProperties();
            String fileEncoding = "Shift_JIS";

            System.out.println( "<?xml version=\"1.0\" encoding=\"" + fileEncoding + "\" ?>" );
            System.out.println( "<" + rootElementName + ">" );

            //----------------------------------------------------
            // 後でXMLSerializerとして別クラスで処理する
            //----------------------------------------------------
            // 指定されたタグ名の数だけループさせる
            Iterator iterator = regexHashMap.keySet().iterator();
            while ( iterator.hasNext() ) {
                String tagName = ( String ) iterator.next();
                String regex = ( String ) regexHashMap.get( tagName );

                // 正規表現で指定された部分を読み取る
                SegmentExtractor se = new SegmentExtractor( regex, content );
                String extractedRegion = se.extract();

                if ( headerHashMap.containsKey( tagName ) ) {
                    // 抽出した部分がTABLEの場合は、行と列のイメージを取得する
                    MatrixContainer mc = new MatrixContainer( extractedRegion );

                    // 内容を表示する
                    MatrixSerializer ms = new MatrixSerializer( mc );
                    ms.dump(); // 標準エラー出力にダンプ

                    // XML形式で主力する
                    String rowNumString = ( String ) headerHashMap.get( tagName );
                    // System.out.println( rowNumString);
                    int headerRowNum = new Integer( rowNumString ).intValue();
                    ms.serialize( tagName, headerRowNum );

                } else {
                    /** 繰り返しを持たない部分は、単純にタグ名で挟み込み出力する **/
                    System.out.println( "<" + tagName + ">" );
                    System.out.println( extractedRegion );
                    System.out.println( "</" + tagName + ">" );
                }
            }

            System.out.println( "</" + rootElementName + ">" );


        } catch ( Exception e ) {
            throw( e );
        }

    }

    /** 単体試験用のメインメソッド */
    static public void main( String[] args ) {

        try {

            TableAnalyzer ta = new TableAnalyzer();
            ta.doProcess( "ta.conf", "mytest.html" );

        } catch ( Exception e ) {
            e.printStackTrace();
        }

    }
}


■クロスレファレンス

Cleanser.java (creates/uses)
	/* NOTHING */

	is created or used by:
		MatrixContainer.java

	/***/ actual line count of source code = 38

CommentEraser.java (creates/uses)
	/* NOTHING */

	is created or used by:
		ConfReader.java

	/***/ actual line count of source code = 23

ConfReader.java (creates/uses)
	├CommentEraser
	└ConfReaderParseException

	is created or used by:
		TableAnalyzer.java

	/***/ actual line count of source code = 63

ConfReaderParseException.java (creates/uses)
	/* NOTHING */

	is created or used by:
		ConfReader.java

	/***/ actual line count of source code = 12

MatrixContainer.java (creates/uses)
	└Cleanser

	is created or used by:
		TableAnalyzer.java

	/***/ actual line count of source code = 56

MatrixSerializer.java (creates/uses)
	/* NOTHING */

	is created or used by:
		TableAnalyzer.java

	/***/ actual line count of source code = 56

SegmentExtractor.java (creates/uses)
	/* NOTHING */

	is created or used by:
		TableAnalyzer.java

	/***/ actual line count of source code = 20

SourceReader.java (creates/uses)
	/* NOTHING */

	is created or used by:
		TableAnalyzer.java

	/***/ actual line count of source code = 20

TableAnalyzer.java (creates/uses)
	├ConfReader
	├MatrixContainer
	├MatrixSerializer
	├SegmentExtractor
	└SourceReader

	/***/ actual line count of source code = 51


■入力HTMLファイル

<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Language" CONTENT="ja">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript">
<META NAME="author" CONTENT="FANCL CORPORATION">
<META NAME="copyright" CONTENT="Copyright FANCL CORPORATION">
<TITLE>商品詳細|健康食品|ファンファンファンオンライン</TITLE><!--Cat02_basic1.base-->
<BASE HREF="http://www.fancl.co.jp/items/">

	<LINK REL="stylesheet" TYPE="text/css" HREF="../css/mac.css">

	<SCRIPT LANGUAGE="JavaScript">
	<!--
		if (navigator.userAgent.indexOf('Win') != -1) {
			document.write('<LINK REL="stylesheet" TYPE="text/css" HREF="../css/win.css">');
			document.close();
		}
	// -->
	</SCRIPT>

	<NOSCRIPT>
		<LINK REL="stylesheet" TYPE="text/css" HREF="../css/win.css" TITLE="for Win">
	</NOSCRIPT>

	<!--#/オーダーアクション#-->
	<SCRIPT language="JavaScript" src="/css/order_action.js" type="text/JavaScript"></SCRIPT>
	<!--#/オーダーアクション#-->

</HEAD>

<BODY BGCOLOR="#FFFFFF" TEXT="#333333" LINK="#0066CC" VLINK="#0066CC" ALINK="#FF0000" MARGINWIDTH="0" MARGINHEIGHT="0">
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="5" ALT=""><BR>

<!--カテゴリツリー表示-->
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="5" HEIGHT="2" ALT=""></TD>
<TD CLASS="size2n"><A HREF="../healthy/top.html"><FONT COLOR="#003300">健康食品</FONT></A>><A HREF="../Items/List?m=category&c1=02&c2=21"><FONT COLOR="#003300">ファンファンファン青汁</FONT></A>><B><FONT COLOR="#003300">青汁粉末 </FONT></B></TD>
</TR>
</TABLE>
<!--/カテゴリツリー表示-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="5" ALT=""><BR>

<!--静的HTML-->
<!--青汁粉末 詳細HTML-->
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="710">
<TR>
<TD ROWSPAN="2"><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR>
<TD><IMG SRC="../items_ex/images_aojiru/ex1_6565a_pict01.jpg" BORDER="0" WIDTH="215" HEIGHT="295" ALT=""></TD><TD><IMG SRC="../items_ex/images_aojiru/ex1_6565a_pict02.jpg" BORDER="0" WIDTH="135" HEIGHT="295" ALT=""></TD>
</TR>
</TABLE></TD>
<TD><IMG SRC="../items_ex/images_aojiru/ex1_6565a_cap01.gif" BORDER="0" WIDTH="360" HEIGHT="90" ALT="栄養重視で携帯にも便利"><BR>
<IMG SRC="../items_ex/images_aojiru/ex1_6565a_cap02.gif" BORDER="0" WIDTH="360" HEIGHT="115" ALT=""></TD>
</TR>
<TR VALIGN="bottom">
<TD ALIGN="right" BACKGROUND="../items_ex/images_aojiru/ex1_6565a_back.gif"><A HREF="../items_ex/ex2_aojiru.html"><IMG SRC="../items_ex/images_aojiru/ex1_btn_kale.gif" BORDER="0" WIDTH="153" HEIGHT="31" ALT="ケールのおはなし"></A><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="15" HEIGHT="83" ALT=""><BR>
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="7" ALT=""></TD>
</TR>
</TABLE>

<!--/静的HTML-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="5" ALT=""><BR>

<!--商品タイトル-->
<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="710">
<TR>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="11" HEIGHT="2" ALT=""></TD>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="689" HEIGHT="2" ALT=""></TD>
</TR>
<TR>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
<TD CLASS="size3n">スティックタイプで使いやすい!</TD>
</TR>
<TR>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
<TD BGCOLOR="#006600" CLASS="size3n">&nbsp;<FONT COLOR="#FFFFFF"><B>青汁粉末 </B></FONT></TD>
</TR>
</TABLE>
<!--/商品タイトル-->

<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="20" ALT=""><BR>

<!--商品詳細-->
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="710">
<TR VALIGN="top">
<TD WIDTH="15"><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
<TD WIDTH="70" ALIGN="center"><!--商品写真--><IMG SRC="/ItemImages/small/6565a.gif" alt="6565a.gif" border="0"><BR><!--/商品写真-->
<!--マーク--><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="10" ALT=""><BR>
<IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0"  WIDTH="36" HEIGHT="36" HSPACE="2" VSPACE="2"><BR><!--/マーク--></TD>
<TD WIDTH="625"><!--健康食品(サプリ) Cat02_1.base-->
<!--商品テーブル Type1-->
	<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD BGCOLOR="#66CC66">
	<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="1">
		<TR>
<!--ESCAPE_TITLE_S-->
			<TD BGCOLOR="#E0FFCC" NOWRAP ALIGN="center"><BR></TD>
<!--ESCAPE_TITLE_E-->
			<TD WIDTH="65" BGCOLOR="#E0FFCC" ALIGN="center"><FONT SIZE="-1"><SPAN CLASS="size2">商品番号</SPAN></FONT></TD>
			<TD WIDTH="125" BGCOLOR="#E0FFCC" ALIGN="center"><FONT SIZE="-1"><SPAN CLASS="size2">内容量</SPAN></FONT></TD>
			<TD WIDTH="100" BGCOLOR="#E0FFCC" ALIGN="center"><FONT SIZE="-1"><SPAN CLASS="size2">税込価格(本体価格)</SPAN></FONT></TD>
			<TD BGCOLOR="#E0FFCC" ALIGN="center"><BR></TD>
			<TD BGCOLOR="#E0FFCC" ALIGN="center"><BR></TD>
			<TD BGCOLOR="#E0FFCC" ALIGN="center"><BR></TD>
		</TR>

<!--START_LOOP_1-->
		<TR VALIGN="middle">
<!--ESCAPE_DETAIL_S-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3"><BR></TD>
<!--ESCAPE_DETAIL_E-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3">6565-10</TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center" CLASS="size3">3.5g×10本</TD>
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="right" CLASS="size3">893円 <FONT SIZE="-1"><SPAN CLASS="size2">(850円)</SPAN></FONT></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="/Cart/AddCart?item_id=6565-10&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565-10&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A HREF="/Seibun/Beauty?item_id=6565-10&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A></TD>
		</TR>
<!--END_LOOP_1-->
		<TR VALIGN="middle">
<!--ESCAPE_DETAIL_S-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3"><IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0" WIDTH="36" HEIGHT="36"></TD>
<!--ESCAPE_DETAIL_E-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3">6565-03</TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center" CLASS="size3">徳用タイプ<br>1箱(30本)×3個</TD>
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="right" CLASS="size3">6,930円 <FONT SIZE="-1"><SPAN CLASS="size2">(6,600円)</SPAN></FONT></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="/Cart/AddCart?item_id=6565-03&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565-03&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A HREF="/Seibun/Beauty?item_id=6565-03&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A></TD>
		</TR>
<!--END_LOOP_1-->
		<TR VALIGN="middle">
<!--ESCAPE_DETAIL_S-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3"><IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0" WIDTH="36" HEIGHT="36"></TD>
<!--ESCAPE_DETAIL_E-->
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="center" CLASS="size3">6565</TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center" CLASS="size3">3.5g×30本</TD>
			<TD BGCOLOR="#FFFFFF" NOWRAP ALIGN="right" CLASS="size3">2,573円 <FONT SIZE="-1"><SPAN CLASS="size2">(2,450円)</SPAN></FONT></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="/Cart/AddCart?item_id=6565&category=02&mode=add" target="header_fancl" onClick="return getInfomation(event);"><IMG src="/shopping/images/item_btn_order.gif" WIDTH="90" HEIGHT="17" HSPACE="6" ALT="カートに入れる" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A href="https://www.fancl.co.jp/UsrItems/FavCtl?item_code=6565&category=02&key=add" target="_top"><IMG src="/shopping/images/item_btn_favorite.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="お気に入り" BORDER="0"></A></TD>
			<TD BGCOLOR="#FFFFFF" ALIGN="center"><A HREF="/Seibun/Beauty?item_id=6565&category=02"><IMG src="/shopping/images/item_btn_seibun_f.gif" WIDTH="72" HEIGHT="17" HSPACE="6" ALT="原材料表示" BORDER="0"></A></TD>
		</TR>
<!--END_LOOP_1-->

	</TABLE></TD></TR></TABLE>
<!--/商品テーブル Type1-->
<!--/健康食品(サプリ) Cat02_1.base-->


<!--おすすめマーク-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="15" ALT=""><BR>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR>
<TD></TD>
</TR>
</TABLE>
<!--/おすすめマーク-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="15" ALT=""><BR>

<!--ESCAPE_PROM_S-->
<!--プロモーションエリア-->
<IMG SRC="../shopping/images/line_prm2.gif" BORDER="0" WIDTH="625" HEIGHT="3" ALT=""><BR>
<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="0" WIDTH="625">
<TR VALIGN="top">
<TD ROWSPAN="2" BGCOLOR="#F3FFF0" NOWRAP><IMG SRC="../shopping/images/campaign/6566apresent.gif" BORDER="0" ALT=""></TD>
<TD ROWSPAN="2" BGCOLOR="#F3FFF0"><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="6" HEIGHT="2" ALT=""></TD>
<TD BGCOLOR="#F3FFF0"><FONT COLOR="#FF6600"><SPAN CLASS="size3"><B>「青汁シェーカー」プレゼント! </B></SPAN></FONT><a href="/aojiru/0411_shaker/0411_shaker.html" target="main_fancl"><img src="/shopping/images/item_btn_click.gif" BORDER="0" ALT="詳しくみる" HSPACE="5" WIDTH="68" HEIGHT="14" ALIGN="absmiddle"></a></TD>
</TR>
<TR VALIGN="top">
<TD BGCOLOR="#F3FFF0"><FONT SIZE="-1"><SPAN CLASS="size2">今ならもれなく「オリジナルシェーカー」プレゼント!シャカシャカ振って、おいしく楽しく!12/31(金)まで<BR>※10本入りは対象外となります。</SPAN></FONT><BR>
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="554" HEIGHT="2" ALT=""></TD>
</TR>
</TABLE>
<IMG SRC="../shopping/images/line_prm2.gif" BORDER="0" WIDTH="625" HEIGHT="3" ALT=""><BR>
<!--/プロモーションエリア-->
<!--ESCAPE_PROM_E-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="15" ALT=""><BR>
<FONT SIZE="-1"><SPAN CLASS="size2">
<!--DETAIL_EXP_S-->
<B><主要成分></B><BR>(1スティック中)<br>食物繊維:1.8g、総カロテン:564μg、ビタミンC:7.0mg、ビタミンE:0.3mg、ビタミンK:71.8μg、カルシウム:56.4mg、カリウム:56.7mg、マグネシウム:8.3mg、総クロロフィル:12.3mg、SOD様活性:2,170単位(エネルギー:8.2Kcal)<br>●着色料・食塩・保存料 無添加<BR>
<!--DETAIL_EXP_E-->
<B><ご注意></B><BR>※腎臓や甲状腺に病気をお持ちの方、心臓のお薬をお飲みの方はかかりつけのお医者さまとご相談の上お召し上がり下さい。<br>※天産物を原料としているため、色・味が季節により異なることがあります。<BR>
<!--DETAIL_EXP_E-->
</SPAN></FONT><!--/商品詳細--></TD>
</TR>
</TABLE>
<!--/商品詳細-->

<!--html_base-->

<!--関連商品-->
<!--ESCAPE_GROUP_S-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="5" ALT=""><BR>
<IMG SRC="../shopping/images/cap_kanren_aojiru.gif" BORDER="0" WIDTH="710" HEIGHT="20" ALT="関連商品"><BR>
<!--関連商品 group.base-->
<!--関連商品リスト-->
<TABLE BORDER="0" CELLPADDING="4" CELLSPACING="0" WIDTH="710">
	<TR>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="7" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="12" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="37" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="67" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="277" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="162" HEIGHT="2" ALT=""></TD>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="92" HEIGHT="2" ALT=""></TD>
	</TR>
<!--GROUP_START_LOOP_1-->
<!--商品一つ分-->
	<TR VALIGN="middle">
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
		<TD NOWRAP><FONT COLOR="#FF3333" size="-1"><B><SPAN CLASS="size2">1</SPAN></B></FONT></TD>
		<TD NOWRAP><IMG SRC="/shopping/images/mark/mark25.gif" ALT="プレゼント" BORDER="0" WIDTH="36" HEIGHT="36"><BR><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""><BR><a href="/aojiru/0411_shaker/0411_shaker.html" target="main_fancl"><img src="/shopping/images/item_click.gif" HEIGHT="13" WIDTH="36" border="0" alt="CLICK!"></a></TD>
		<TD NOWRAP ALIGN="center"><IMG SRC="/ItemImages/small/6566a.gif" alt="6566a.gif"></TD>
		<TD CLASS="size3">ツイントース配合でもっとおいしく!もっとカルシウム!<BR><B><a href="/Items/Detail?category=02&item_code=6566a" style="color : #339966;"><U>青汁粉末ツイントース配合</U></a></B></TD>
		<TD NOWRAP ALIGN="right" CLASS="size3">2,835円 <FONT SIZE="-1"><SPAN CLASS="size2">(2,700円)</SPAN></FONT><BR>〜7,613円 <FONT SIZE="-1"><SPAN CLASS="size2">(7,250円)</SPAN></FONT></TD>
		<TD NOWRAP ALIGN="right"><a href="/Items/Detail?category=02&item_code=6566a" style="color : #339966;"><U><img src="/shopping/images/list_btn_size.gif" WIDTH="86" HEIGHT="17" ALT="サイズを選ぶ" VSPACE="2" border="0"></U></a><BR><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="4" ALT=""><BR></TD>
	</TR>
	<TR>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
		<TD COLSPAN="6"><IMG SRC="../shopping/images/line_lightgray.gif" BORDER="0" WIDTH="687" HEIGHT="3" ALT=""></TD>
	</TR>
<!--/商品一つ分-->
<!--GROUP_END_LOOP_1-->
<!--商品一つ分-->
	<TR VALIGN="middle">
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
		<TD NOWRAP><FONT COLOR="#FF3333" size="-1"><B><SPAN CLASS="size2">2</SPAN></B></FONT></TD>
		<TD NOWRAP><BR><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""><BR></TD>
		<TD NOWRAP ALIGN="center"><IMG SRC="/ItemImages/small/6500-01.gif" alt="6500-01.gif"></TD>
		<TD CLASS="size3">飲みやすいケール100%冷凍青汁<BR><B><a href="/Items/Detail?category=02&item_code=6500-01" style="color : #339966;"><U>ファンファンファン青汁ストレート 通販セット(100g×30袋)</U></a></B></TD>
		<TD NOWRAP ALIGN="right" CLASS="size3">3,150円 <FONT SIZE="-1"><SPAN CLASS="size2">(3,000円)</SPAN></FONT></TD>
		<TD NOWRAP ALIGN="right"><a href="/Items/Detail?category=02&item_code=6500-01" style="color : #339966;"><U><img src="/shopping/images/list_btn_view.gif" WIDTH="86" HEIGHT="17" ALT="詳しくみる" VSPACE="2" border="0"></U></a><BR><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="4" ALT=""><BR><a href="/Cart/AddCart?category=02&item_id=6500-01&mode=add" target="header_fancl" onClick="return getInfomation(event);"><img src="/shopping/images/list_btn_order.gif" WIDTH="86" HEIGHT="17" ALT="カートに入れる" VSPACE="2" border="0"></a></TD>
	</TR>
	<TR>
		<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="2" ALT=""></TD>
		<TD COLSPAN="6"><IMG SRC="../shopping/images/line_lightgray.gif" BORDER="0" WIDTH="687" HEIGHT="3" ALT=""></TD>
	</TR>
<!--/商品一つ分-->
<!--GROUP_END_LOOP_1-->
		<TR>
			<TD COLSPAN="7" ALIGN="right"><FONT SIZE="-1"><SPAN  CLASS="size2n">税込価格を表示しています。(カッコ内は本体価格)</SPAN></FONT></TD>
		</TR>
	</TABLE>
<!--/関連商品リスト-->
<!--/関連商品 group.base-->

<!--ESCAPE_GROUP_E-->
<!--/関連商品-->

<!--共通バックボタン-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="30" ALT=""><BR>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR>
<TD><IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="15" HEIGHT="2" ALT=""></TD>
<TD><A HREF="javascript:history.back();"><IMG SRC="../shopping/images/btn_prevpage.gif" BORDER="0" WIDTH="95" HEIGHT="13" ALT="前のページに戻る"></A></TD>
</TR>
</TABLE>
<!--/共通バックボタン-->

<!--共通フッタ-->
<IMG SRC="../shopping/images/spacer.gif" BORDER="0" WIDTH="2" HEIGHT="30" ALT=""><BR>
<TABLE BORDER="0" WIDTH="710" CELLPADDING="0" CELLSPACING="0">
<TR>
<TD><IMG SRC="../shopping/images/line_g_bottom.gif" BORDER="0" WIDTH="710" HEIGHT="7" ALT=""></TD>
</TR>
<TR>
<TD ALIGN="right"><IMG SRC="../images/copyright.gif" BORDER="0" WIDTH="305" HEIGHT="11" ALT=""></TD>
</TR>
</TABLE>
<!--/共通フッタ-->
<BR><BR>

<SCRIPT LANGUAGE="JavaScript">
<!--
createObj(this);
//-->
</SCRIPT>
</BODY></HTML>

戻る inserted by FC2 system