Vor kurzem habe ich die Volltextsuche von Lucene studiert. An vielen Stellen muss ich HTML-Inhalte analysieren oder analysieren. Das eigene Demoprogramm von Lucene bietet auch einen HTML-Parser,
aber das ist der Fall Keine reine Java-Lösung. Also habe ich überall gesucht und einen „HTMLParser“ im Internet gefunden.
In ein paar Tagen werde ich den Code für den Volltextabruf in Lucene veröffentlichen diese Seite usw.).
import 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;
import org.htmlparser.visitors.TextExtractingVisitor;
import com.jscud.util.LogMan; //Eine Protokollierungsklasse
/**
* Demonstriert die Anwendung von 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(content);
System.out.println ("================================ ==");
test3(content );
System.out.println("======================= ==============") ;
test4(content);
System.out.println("============ ================ ========");
test5(aFile);
System.out.println("== ================ ==================");
//Der Zugriff auf externe Ressourcen ist relativ langsam
test5("http://www.jscud.com ");
System.out.println("===================== =================" );
}
/**
* Lesen Sie die Datei, um den Inhalt zu analysieren.
* filePath kann auch eine URL sein.
*
* @param resources file/Url
*/
public static void test5(String Ressource) löst eine Ausnahme aus
{
Parser myParser = new Parser(resource );
//Encoding festlegen
myParser.setEncoding("GBK");
HtmlSeitenbesucher = new HtmlPage(myParser);
myParser.visitAllNodesWith(visitor );
String textInPage = Visitors.getTitle();
System.out.println(textInPage);
}
/**
* Für eine Standard-HTML-Seite wird diese Methode empfohlen
*/
public static void test4(String content) throws Exception
{
Parser myParser;
myParser = Parser.createParser( content, "GBK");
HtmlPage Visitors = new HtmlPage (myParser);
myParser.visitAllNodesWith(visitor);
String textInPage = Visitors.getTitle();
System.out.println(textInPage);
}
/**
* Verwenden Sie den Besuchermodus, um HTML-Seiten zu analysieren.
*
* Kleine Vorteile: Übersetzte Symbole wie <>
* Nachteile: Es gibt viele Leerzeichen und kann keinen Link extrahieren
*
*/
public static void test3(String content) löst eine Ausnahme aus
{
Parser myParser;
myParser = Parser.createParser(content, " GBK");
TextExtractingVisitor Visitors = new TextExtractingVisitor();
myParser.visitAllNodesWith(visitor);
String textInPage = Visitors.getExtractedText();
System.out.println(textInPage);
}
/**
* Erhalten Sie den Inhalt von normalem Text und Links.
*
* Verwenden Sie Filterbedingungen.
*/
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);
//Meta noch nicht verarbeiten
//NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);
OrFilter lastFilter = new OrFilter( );
lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });
nodeList = myParser.parse (lastFilter);
Node[] nodes = nodeList.toNodeArray( );
for (int i = 0; i < nodes.length; i++)
{
Node anode = (Node) nodes[i];
String line = "";
if (anode exampleof TextNode)
{
TextNode textnode = (TextNode) anode;
//line = textnode.toPlainTextString().trim();
line = textnode.getText();
}
else if (anode instanceof LinkTag)
{
LinkTag linknode = ( LinkTag) anode;
line = linknode.getLink();
//@todo JSP-Tags filtern: Sie können diese Funktion selbst implementieren
//line = StringFunc.replace(line, "< ;%.*%>", "");
}
if (isTrimEmpty(line))
continue;
System.out.println(line);
}
}
/**
* Gewöhnliche Textknoten analysieren.
*
* @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); //Hier könnte eine Ausnahme ausgelöst werden
for (int i = 0; i < nodes.length; i++)
{
TextNode textnode = (TextNode) nodes[i];
String line = textnode.toPlainTextString().trim();
if (line.equals(""))
continue;
System.out.println(line);
}
}
/**
* Eine Datei in einen String einlesen.
*
* @param sFileName Dateiname
* @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 Textdateifehler", e);
}
return sbStr.toString();
}
/**
* Ob die Zeichenfolge leer ist, nachdem linke und rechte Leerzeichen entfernt wurden
* @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;
}
/**
* Ob die Zeichenfolge leer ist: null oder die Länge 0.
* @param astr Quellzeichenfolge.
* @return boolean
*/
public static boolean isBlank(String astr)
{
if ((null == astr) || (astr.length() == 0))
{
return true;
}
else
{
return false;
}
}
}
以上就是htmlParser使用教程的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!