最近、私は Lucene の全文検索を研究していますが、多くの場所で HTML コンテンツや HTML ページを解析する必要があります。Lucene 独自のデモ プログラムでも HTML パーサーを提供していますが、これは純粋な Java ソリューションではありません。それであちこち探したところ、インターネットで「HTMLParser」を見つけました。
Luceneで全文を取得するためのコードを数日以内に投稿します(このサイトの記事を取得するなど)。
javaをインポートします。 io.BufferedReader;
import java.io.File; import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.htmlparser.Node;
import org.htmlparser .Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.nodes.TextNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util .NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.htmlparser.visitors.TextExtractingVisitor;
import com.jscud.util.LogMan; //
* Html Parse のアプリケーションを示します。
** @author scud http://www.jscud.com
*/
public class ParseHtmlTest
{
public static void main(String[] args) throws Exception
{
String content = readTextFile(aFile, "GBK") ;
System.out.println("====================== ============ ====);
test2(コンテンツ);
System.out.println("================= ============= ============);
test3(コンテンツ);
System.out.println("============= ============= ============);
test4(コンテンツ);
System.out.println("========= ============= ====================);
test5(aFile);
System.out.println("===== ============= ========================);
//外部リソースへのアクセスは比較的遅い
test5("http: //www.jscud.com");
}
* ファイルを読んで内容を分析します。
* filePath は URL にすることもできます*
* @param resource file/Url
*/
public static void test5(String resource) throws Exception
{
Parser myParser = new Parser(resource);
//エンコーディングを設定します
myParser.setEncoding("GBK");
HtmlPage Visitor = new HtmlPage(myParser);
}
/**
* 標準の HTML ページの場合は、この方法をお勧めします。*/
{
Parser myParser;
myParser = Parser.createParser(content, "GBK");
HtmlPage Visitor = new HtmlPage(myParser);
myParser.visitAllNodesWith(visitor) ;
String textInPage = visitTitle();
System.out.println(textInPage);
}/*** HTML ページを解析するにはビジター モードを使用します。
*
* 欠点: スペースが多く、リンクを抽出できません
*
*/
public static void test3(String content) throws Exception
{
Parser myParser;
myParser = Parser.createParser(content, "GBK");
TextExtractingVisitor Visitor = new TextExtractingVisitor();
myParser.visitAllNodesWith(visitor);
String textInPage = visit.getExtractedText();
System.out.println(textInPage);
}/*** 通常のテキストとリンクのコンテンツを取得します。
*
public static void test2(String content) throws ParserException
{
Parser myParser;
NodeList nodeList = null;
myParser = Parser.createParser( content, "GBK");
NodeFilter textFilter = new NodeClassFilter(TextNode.class);
NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);
//Do今はメタを処理しません
//NodeFilter metaFilter = new NodeClassFilter(MetaTag .class);
OrFilter lastFilter = new OrFilter();
nodeList = myParser .parse(lastFilter);
Node[] ノード = nodeList.toNodeArray();
if (TextNodeのアノードインスタンス)
{
TextNode textnode = (TextNode) anode;
line = textnode.getText() ;
}
else if (anodeinstanceofLinkTag)
{
LinkTag linknode = (LinkTag) anode;
line = linknode.getLink();
//@todo JSP タグをフィルタリング: この関数は自分で実装できます
// line = StringFunc.replace(line, "<%.*%> ;", "");
}
if (isTrimEmpty(line))
Continue;
System.out.println(line);
}
/**
* 通常のテキスト ノードを解析します。
*
* @param content
* @throws ParserException
*/
public static void test1(String content) throws ParserException
{
Parser myParser;
Node[] nodes = null;
myParser = Parser.createParser(content, null);
nodes = myParser.extractAllNodesThatAre(TextNode.class); //ここで例外がスローされる可能性があります
for (int i = 0; i
TextNode textnode = (TextNode) nodes[i];
String line = textnode.toPlainTextString().trim ();
if (line.equals(""))
続行;
System.out.println(line);
}
}
/**
* ファイルを文字列に読み込みます。
*
* @param sFileName ファイル名
* @param sEncode String
* @return file content
*/
public static String readTextFile(String sFileName 、 String sEncode)
{
StringBuffer sbStr = new StringBuffer();
try
{
File ff = new File(sFileName);
InputStreamReader read = new InputStreamReader(new FileInputStream(ff),
sEncode);
BufferedReader ins = new BufferedReader(read);
String dataLine = "";
while (null != (dataLine = ins.readLine()))
{
sbStr.append(dataLine);
sbStr.append("rn") ;
}
ins.close();
}
catch (Exception e)
{
LogMan.error("read Text File Error", e);
}
return sbStr.toString();
}
/**
* 左右のスペースを削除した後に文字列が空かどうか
* @param astr String
* @return boolean
*/
public static boolean isTrimEmpty(String astr)
{
if ((null == astr) || (astr.length() == 0))
{
return true;
}
if (isBlank(astr.trim()))
{
return true;
}
return false;
}
/**
* 文字列が空かどうか: null または長さは 0 です。
* @param astr ソース文字列。
* @return boolean
*/
public static boolean isBlank(String astr)
{
if ( (null == astr) || (astr.length() == 0))
{
return true;
}
else
{
return false;
}
}
}
以上はhtmlParserの使用法です内容、更なる相关内容请关注PHP中文网(m.sbmmt.com)!