ホームページ >ウェブフロントエンド >htmlチュートリアル >htmlParser の使用方法のチュートリアル

htmlParser の使用方法のチュートリアル

黄舟
黄舟オリジナル
2016-12-22 14:44:371669ブラウズ

最近、私は 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.NodeFilter;

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 aFile = "e:/jscud/temp/test.htm";


String content = readTextFile(aFile, "GBK") ;

test1(content);

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");

System.out.println("================================ ====");


}

/ **

* ファイルを読んで内容を分析します。

* 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);

myParser.visitAllNodesWith(visitor);

String textInPage = visit.getTitle();

System.out.println(textInPage) ;

}

/**
* 標準の HTML ページの場合は、この方法をお勧めします。*/

public static void test4(String content) throws Exception

{
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();

lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });


nodeList = myParser .parse(lastFilter);

Node[] ノード = nodeList.toNodeArray();

for (int i = 0; i {ノード anode = (ノード) ノード[i] ;

String line = "";

if (TextNodeのアノードインスタンス)
{
TextNode textnode = (TextNode) anode;

//line = textnode.toPlainTextString().trim();

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中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。