Explication détaillée de l'utilisation de HTMLParser (3)
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)!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Guide de la bordure de tableau en HTML. Nous discutons ici de plusieurs façons de définir une bordure de tableau avec des exemples de bordure de tableau en HTML.

Ceci est un guide des tableaux imbriqués en HTML. Nous discutons ici de la façon de créer un tableau dans le tableau ainsi que des exemples respectifs.

Guide de la marge HTML gauche. Nous discutons ici d'un bref aperçu de la marge gauche HTML et de ses exemples ainsi que de son implémentation de code.

Guide de mise en page des tableaux HTML. Nous discutons ici des valeurs de la mise en page des tableaux HTML ainsi que des exemples et des résultats en détail.

Guide de l'espace réservé de saisie HTML. Nous discutons ici des exemples d'espace réservé d'entrée HTML ainsi que des codes et des sorties.

Guide de la liste ordonnée HTML. Ici, nous discutons également de l'introduction de la liste et des types HTML ordonnés ainsi que de leur exemple respectivement.

Guide pour déplacer du texte en HTML. Nous discutons ici d'une introduction, du fonctionnement des balises de sélection avec la syntaxe et des exemples à implémenter.

Guide du bouton HTML onclick. Nous discutons ici de leur introduction, de leur fonctionnement, des exemples et de l'événement onclick dans divers événements respectivement.
