Une fois que HTMLParser a parcouru le contenu de la page Web, il enregistre les résultats dans une structure arborescente (forêt). Il existe deux manières pour HTMLParser d'accéder au contenu du résultat. Utilisez Filtre et utilisez Visiteur.
(1) Classe Filter
Comme son nom l'indique, Filter consiste à filtrer les résultats et à obtenir le contenu requis. HTMLParser définit un total de 16 filtres différents dans le package org.htmlparser.filters, qui peuvent également être divisés en plusieurs catégories.
Filtre de classe de jugement :
TagNameFilter HasAttributeFilter HasChildFilter HasParentFilter HasSiblingFilter IsEqualFilter
Filtre d'opération logique :
AndFilter NotFilter OrFilter XorFilter 其他Filter: NodeClassFilter StringFilter LinkStringFilter LinkRegexFilter RegexFilter CssSelectorNodeFilter
Toutes les classes de filtre implémentent l'interface org.htmlparser.NodeFilter. Cette interface n'a qu'une seule fonction principale :
boolean accept (Node node);
(2) Prise en main de la classe de jugement FilterHTMLParser (2) - Contenu du nœud, ajoutez vous-même la partie import)
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(); } }
Résultat de sortie :
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
On peut voir que les deux nœuds Div du fichier ont été supprimés. Les opérations suivantes peuvent être effectuées sur ces deux nœuds DIV
2.2 HasChildFilter
Jetons un œil à HasChildFilter. Quand je viens de voir ce filtre, j'ai pris pour acquis que ce filtre renvoyait une balise avec enfant. Directement initialisé un
NodeFilter filter = new HasChildFilter();
Modifier le code :
NodeFilter innerFilter = new TagNameFilter ("DIV"); NodeFilter filter = new HasChildFilter(innerFilter); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Résultat de sortie :
getText:body ================================================= getText:div id="top_main" =================================================
Comme vous pouvez le voir , La sortie est deux nœuds Tag avec sous-Tag DIV. (Le corps a le nœud enfant DIV "top_main" et "top_main" a le nœud enfant "logoindex".
Notez que HasChildFilter a également un constructeur :
public HasChildFilter (NodeFilter filter, boolean recursive)
Si Si récursif est faux, seuls les nœuds enfants de premier niveau seront filtrés. Par exemple, dans l'exemple précédent, body et top_main ont tous deux des nœuds DIV dans les nœuds enfants de premier niveau, ils correspondent donc si nous utilisons le. méthode suivante. :
NodeFilter filter = new HasChildFilter( innerFilter, true );
Résultat de sortie :
getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText:body ================================================= getText:div id="top_main" =================================================
Vous pouvez voir qu'il y a un html xmlns="http:// www.w3.org/1999/xhtml", il s'agit du nœud (nœud racine) de la page HTML entière. Bien qu'il n'y ait pas de nœud DIV directement sous ce nœud, il y a un nœud DIV sous son corps de nœud enfant, donc c'est le cas. correspond également.
2.3 HasAttributeFilter
HasAttributeFilter a 3 constructeurs :
public HasAttributeFilter (); public HasAttributeFilter (String attribute); public HasAttributeFilter (String attribute, String value);
Ce filtre peut correspondre à l'attribut contenant le nom spécifié, ou au nœud avec l'attribut spécifié comme la valeur spécifiée. Il est plus facile d'illustrer avec un exemple
Méthode d'appel 1 :
NodeFilter filter = new HasAttributeFilter(); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Résultat de sortie :
什么也没有输出。
Méthode d'appel 2 :
NodeFilter filter = new HasAttributeFilter( "id" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Résultat de sortie :
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
Méthode d'appel 3 :
NodeFilter filter = new HasAttributeFilter( "id", "logoindex" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Résultat de sortie :
getText:div id="logoindex" =================================================
C'est très simple Haha
2.4 Autres colonnes de jugement Filtre
Les fonctions de HasParentFilter et HasSiblingFilter sont similaires à HasChildFilter. . Vous devriez le comprendre après l'avoir essayé vous-même. Le paramètre constructeur de
IsEqualFilter est un Node :
public IsEqualFilter (Node node) { mNode = node; } accept函数也很简单: public boolean accept (Node node) { return (mNode == node); }
Pas besoin de trop expliquer (3) Opération logique. Filtre (4) Autres filtres : Premiers pas avec HTMLParser (2) - Contenu du nœud Nous avons déjà découvert les différents types de nœuds. Ce filtre peut filtrer en fonction du type.
Code de test :
<. 🎜>
Résultat. :
NodeFilter filter = new NodeClassFilter(RemarkNode.class); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.2 StringFilter
getText:这是注释 ================================================= 可以看到只有RemarkNode(注释)被输出了。
Code de test : <🎜. >
<!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>
Résultats de sortie :
NodeFilter filter = new StringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
Vous pouvez voir que les balises contenant le titre, les deux chaînes de contenu et la chaîne de texte du lien sont toutes sorties, mais les commentaires et les balises de lien eux-mêmes ne sont pas affichés.
getText:白泽居-title-www.baizeju.com ================================================= getText: 白泽居-字符串1-www.baizeju.com ================================================= getText:白泽居-链接文本-www.baizeju.com ================================================= getText: 白泽居-字符串2-www.baizeju.com =================================================
Code de test :
Résultat de sortie :
NodeFilter filter = new LinkStringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
4.4 Plusieurs autres filtres
Plusieurs autres filtres sont également basés sur des paires de chaînes différentes les domaines sont utilisés pour le jugement. La principale différence par rapport aux précédents est qu'ils prennent en charge les expressions régulières. Cela dépasse le cadre de cet article, vous pouvez l’expérimenter vous-même.
getText:a href="http://www.baizeju.com" =================================================
3.1 AndFilter
AndFilter peut combiner deux types de filtres. Seuls les nœuds qui remplissent les conditions en même temps seront filtrés.
Code de test :
Résultat de sortie :
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new AndFilter(filterID, filterChild);
3.2 OrFilter
Remplacer le AndFilter précédent par OrFilter
getText:div id="logoindex" =================================================
Résultat de sortie :
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new OrFilter(filterID, filterChild);
3.3 NotFilter
Remplacer le AndFilter précédent par NotFilter
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
Résultat de sortie :
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
À l'exception des quelques balises sorties dans la version 3.2 précédente, le reste des balises est ici.
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: =================================================
Code de test :
Résultat de sortie :
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new XorFilter(filterID, filterChild);
4.1 NodeClassFilter
Ce filtre est utilisé pour déterminer si le type de nœud est un type de nœud spécifique. Dans
getText:div id="top_main" =================================================
Voici le fichier HTML utilisé pour les tests :
<!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)!