Nachdem HTMLParser den Inhalt der Webseite durchlaufen hat, speichert er die Ergebnisse in einer Baumstruktur (Gesamtstruktur). Für HTMLParser gibt es zwei Möglichkeiten, auf den Ergebnisinhalt zuzugreifen. Verwenden Sie Filter und Besucher.
(1) Filterklasse
Wie der Name schon sagt, dient Filter dazu, die Ergebnisse zu filtern und den erforderlichen Inhalt zu erhalten. HTMLParser definiert im Paket org.htmlparser.filters insgesamt 16 verschiedene Filter, die auch in mehrere Kategorien unterteilt werden können.
Beurteilungsklassenfilter:
TagNameFilter HasAttributeFilter HasChildFilter HasParentFilter HasSiblingFilter IsEqualFilter
Logischer Operationsfilter:
AndFilter NotFilter OrFilter XorFilter 其他Filter: NodeClassFilter StringFilter LinkStringFilter LinkRegexFilter RegexFilter CssSelectorNodeFilter
Alle Filterklassen implementieren die Schnittstelle org.htmlparser.NodeFilter. Diese Schnittstelle hat nur eine Hauptfunktion:
boolean accept (Node node);
(2) Erste Schritte mit der Beurteilungsklasse FilterHTMLParser (2) - Knoteninhalt, fügen Sie den Importteil selbst hinzu)
public static void main(String[] args) { try{ Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() ); // 这里是控制测试的部分,后面的例子修改的就是这个地方。 NodeFilter filter = new TagNameFilter ("DIV"); NodeList nodes = parser.extractAllNodesThatMatch(filter); if(nodes!=null) { for (int i = 0; i < nodes.size(); i++) { Node textnode = (Node) nodes.elementAt(i); message("getText:"+textnode.getText()); message("================================================="); } } } catch( Exception e ) { e.printStackTrace(); } }
Ausgabeergebnis:
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
Es ist ersichtlich, dass beide Div-Knoten in der Datei entfernt wurden. Die folgenden Operationen können auf diesen beiden DIV-Knoten ausgeführt werden
2.2 HasChildFilter
Werfen wir einen Blick auf HasChildFilter. Als ich diesen Filter gerade sah, ging ich davon aus, dass dieser Filter ein Tag mit Kind zurückgab. Direkt initialisiert a
NodeFilter filter = new HasChildFilter();
Ändern Sie den Code:
NodeFilter innerFilter = new TagNameFilter ("DIV"); NodeFilter filter = new HasChildFilter(innerFilter); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Ausgabeergebnis:
getText:body ================================================= getText:div id="top_main" =================================================
Wie Sie sehen können , Die Ausgabe besteht aus zwei Tag-Knoten mit DIV-Sub-Tag. (Der Körper hat den untergeordneten Knoten DIV „top_main“ und „top_main“ hat den untergeordneten Knoten „logoindex“.
Beachten Sie, dass HasChildFilter auch einen Konstruktor hat:
public HasChildFilter (NodeFilter filter, boolean recursive)
Wenn „Rekursiv“ den Wert „Falsch“ hat, werden nur die untergeordneten Knoten der ersten Ebene gefiltert. Im vorherigen Beispiel haben beispielsweise sowohl „body“ als auch „top_main“ DIV-Knoten in den untergeordneten Knoten der ersten Ebene, sodass sie übereinstimmen, wenn wir verwenden Folgende Methode. :
NodeFilter filter = new HasChildFilter( innerFilter, true );
Ausgabeergebnis:
getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText:body ================================================= getText:div id="top_main" =================================================
Sie können sehen, dass es ein zusätzliches HTML xmlns="http:// gibt www.w3.org/1999/xhtml“, dies ist der Knoten (Wurzelknoten) der gesamten HTML-Seite. Obwohl sich direkt unter diesem Knoten kein DIV-Knoten befindet, befindet sich unter seinem untergeordneten Knotenkörper ein DIV-Knoten auch abgeglichen.
2.3 HasAttributeFilter
HasAttributeFilter hat 3 Konstruktoren:
public HasAttributeFilter (); public HasAttributeFilter (String attribute); public HasAttributeFilter (String attribute, String value);
Dieser Filter kann mit dem Attribut übereinstimmen, das den angegebenen Namen enthält, oder mit dem Knoten mit dem angegebenen Attribut als Der angegebene Wert lässt sich einfacher anhand eines Beispiels veranschaulichen.
Aufrufmethode 1:
NodeFilter filter = new HasAttributeFilter(); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Ausgabeergebnis:
什么也没有输出。
Aufrufmethode 2:
NodeFilter filter = new HasAttributeFilter( "id" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Ausgabeergebnis:
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
Aufrufmethode 3:
NodeFilter filter = new HasAttributeFilter( "id", "logoindex" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Ausgabeergebnis:
getText:div id="logoindex" =================================================
Es ist ganz einfach Haha
2.4 Andere Beurteilungsspalten Filter
Die Funktionen von HasParentFilter und HasSiblingFilter ähneln denen von HasChildFilter . Sie sollten es verstehen, nachdem Sie es selbst ausprobiert haben. Der Konstruktorparameter von
IsEqualFilter ist ein Knoten:
public IsEqualFilter (Node node) { mNode = node; } accept函数也很简单: public boolean accept (Node node) { return (mNode == node); }
Keine Notwendigkeit, zu viel zu erklären Filter (4) Andere Filter: Erste Schritte mit HTMLParser (2) – Knoteninhalt Wir haben bereits etwas über die verschiedenen Knotentypen gelernt. Dieser Filter kann nach dem Typ filtern:
Ergebnis:
NodeFilter filter = new NodeClassFilter(RemarkNode.class); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.2 StringFilter
getText:这是注释 ================================================= 可以看到只有RemarkNode(注释)被输出了。
Testcode:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-title-www.baizeju.com</title></head> <html xmlns="http://www.w3.org/1999/xhtml"> <body > <div id="top_main"> <div id="logoindex"> <!--这是注释 白泽居-www.baizeju.com --> 白泽居-字符串1-www.baizeju.com <a href="http://www.baizeju.com">白泽居-链接文本-www.baizeju.com</a> </div> 白泽居-字符串2-www.baizeju.com </div> </body> </html>
Ausgabeergebnisse:
NodeFilter filter = new StringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Sie können sehen, dass die Tags, die den Titel, die beiden Inhaltszeichenfolgen und die Linktextzeichenfolge enthalten, alle ausgegeben werden, aber die Kommentare und Link-Tags selbst werden nicht ausgegeben.
getText:白泽居-title-www.baizeju.com ================================================= getText: 白泽居-字符串1-www.baizeju.com ================================================= getText:白泽居-链接文本-www.baizeju.com ================================================= getText: 白泽居-字符串2-www.baizeju.com =================================================
Mit diesem Filter wird ermittelt, ob der Link eine bestimmte Zeichenfolge enthält, und er kann zum Herausfiltern von Links verwendet werden, die auf eine bestimmte Website verweisen.
Testcode:
Ausgabeergebnis:
NodeFilter filter = new LinkStringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.4 Mehrere andere Filter
getText:a href="http://www.baizeju.com" =================================================
Bei den zuvor eingeführten Filtern handelt es sich allesamt um einfache Filter, die nur nach einem einzigen Bedingungstyp filtern können. HTMLParser unterstützt die Kombination einfacher Filtertypen, um komplexe Bedingungen zu implementieren. Das Prinzip ist dasselbe wie die logische Funktionsweise allgemeiner Programmiersprachen.
3.1 AndFilter
AndFilter kann zwei Arten von Filtern kombinieren. Nur Knoten, die die Bedingungen gleichzeitig erfüllen, werden gefiltert.
Testcode:
Ausgabeergebnis:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new AndFilter(filterID, filterChild);
3.2 OrFilter
getText:div id="logoindex" =================================================
Ausgabeergebnis:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new OrFilter(filterID, filterChild);
3.3 NotFilter
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
Ausgabeergebnis:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
Mit Ausnahme der wenigen Tags, die in der vorherigen Version 3.2 ausgegeben wurden, sind die restlichen Tags hier.
getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" ================================================= getText: ================================================= getText:head ================================================= getText:meta http-equiv="Content-Type" content="text/html; charset=gb2312" ================================================= getText:title ================================================= getText:白泽居-www.baizeju.com ================================================= getText:/title ================================================= getText:/head ================================================= getText: ================================================= getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText: ================================================= getText:body ================================================= getText: ================================================= getText: ================================================= getText: ================================================= getText:这是注释 ================================================= getText: 白泽居-www.baizeju.com ================================================= getText:a href="http://www.baizeju.com" ================================================= getText:白泽居-www.baizeju.com ================================================= getText:/a ================================================= getText: ================================================= getText:/div ================================================= getText: 白泽居-www.baizeju.com ================================================= getText:/div ================================================= getText: ================================================= getText:/body ================================================= getText: ================================================= getText:/html ================================================= getText: =================================================
Dieser Filter wird verwendet, um zu bestimmen, ob der Knotentyp ein bestimmter Knotentyp ist. In
2.1 TagNameFilter
TabNameFilter ist der am einfachsten zu verstehende Filter, der auf der Grundlage des Namens des Tags filtert.
Hier ist die zum Testen verwendete HTML-Datei:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-www.baizeju.com</title>< /head> <html xmlns="http://www.w3.org/1999/xhtml"> <body > <div id="top_main"> <div id="logoindex"> <!--这是注释--> 白泽居-www.baizeju.com <a href="http://www.baizeju.com">白泽居-www.baizeju.com</a> </div> 白泽居-www.baizeju.com </div> </body> </html>
以上就是HTMLParser使用详解(3)的内容,更多相关内容请关注PHP中文网(www.php.cn)!