Detaillierte Erläuterung der Verwendung von HTMLParser (3)

黄舟
Freigeben: 2016-12-29 15:57:20
Original
1184 Leute haben es durchsucht

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
Nach dem Login kopieren

Logischer Operationsfilter:

AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
Nach dem Login kopieren

Alle Filterklassen implementieren die Schnittstelle org.htmlparser.NodeFilter. Diese Schnittstelle hat nur eine Hauptfunktion:

boolean accept (Node node);
Nach dem Login kopieren

(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();
}
}
Nach dem Login kopieren

Ausgabeergebnis:

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Nach dem Login kopieren
Nach dem Login kopieren

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();
Nach dem Login kopieren

Ändern Sie den Code:

NodeFilter innerFilter = new TagNameFilter ("DIV");
NodeFilter filter = new HasChildFilter(innerFilter);
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Nach dem Login kopieren

Ausgabeergebnis:

getText:body 
=================================================
getText:div id="top_main"
=================================================
Nach dem Login kopieren

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)
Nach dem Login kopieren


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 );
Nach dem Login kopieren


Ausgabeergebnis:

getText:html xmlns="http://www.w3.org/1999/xhtml"
=================================================
getText:body 
=================================================
getText:div id="top_main"
=================================================
Nach dem Login kopieren

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);
Nach dem Login kopieren

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);
Nach dem Login kopieren

Ausgabeergebnis:

什么也没有输出。
Nach dem Login kopieren



Aufrufmethode 2:

NodeFilter filter = new HasAttributeFilter( "id" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Nach dem Login kopieren

Ausgabeergebnis:

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Nach dem Login kopieren
Nach dem Login kopieren

Aufrufmethode 3:

NodeFilter filter = new HasAttributeFilter( "id", "logoindex" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Nach dem Login kopieren

Ausgabeergebnis:

getText:div id="logoindex"
=================================================
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
Nach dem Login kopieren


4.2 StringFilter

Dieser Filter wird verwendet, um die Tags zu filtern, die den angegebenen Inhalt in der angezeigten Zeichenfolge enthalten und der Inhalt der nicht anzeigbaren Zeichenfolge (wie Kommentare, Links usw.) wird nicht angezeigt.
getText:这是注释
=================================================
可以看到只有RemarkNode(注释)被输出了。
Nach dem Login kopieren
Ändern Sie den Beispielcode:




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>
Nach dem Login kopieren


Ausgabeergebnisse:

NodeFilter filter = new StringFilter("www.baizeju.com");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Nach dem Login kopieren


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
=================================================
Nach dem Login kopieren
4.3 LinkStringFilter

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);
Nach dem Login kopieren


4.4 Mehrere andere Filter

Mehrere andere Filter basieren ebenfalls auf verschiedenen Zeichenfolgenpaaren Domänen werden zur Beurteilung verwendet. Der Hauptunterschied zu den vorherigen besteht darin, dass sie reguläre Ausdrücke unterstützen. Dies würde den Rahmen dieses Artikels sprengen, Sie können es selbst ausprobieren.
getText:a href="http://www.baizeju.com"
=================================================
Nach dem Login kopieren

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);
Nach dem Login kopieren


3.2 OrFilter

Ersetzen Sie den vorherigen AndFilter durch OrFilter
getText:div id="logoindex"
=================================================
Nach dem Login kopieren
Testcode:




Ausgabeergebnis:

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new OrFilter(filterID, filterChild);
Nach dem Login kopieren


3.3 NotFilter

Ersetzen Sie den vorherigen AndFilter durch NotFilter
getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Nach dem Login kopieren
Testcode:




Ausgabeergebnis:

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
Nach dem Login kopieren


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:
=================================================
Nach dem Login kopieren
3.4 4.1 NodeClassFilter

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>
Nach dem Login kopieren

 以上就是HTMLParser使用详解(3)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage