Maison > interface Web > tutoriel HTML > le corps du texte

Explication détaillée de l'utilisation de HTMLParser (3)

黄舟
Libérer: 2016-12-29 15:57:20
original
1184 Les gens l'ont consulté

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
Copier après la connexion

Filtre d'opération logique :

AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
Copier après la connexion

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);
Copier après la connexion

(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();
}
}
Copier après la connexion

Résultat de sortie :

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Copier après la connexion
Copier après la connexion

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();
Copier après la connexion

Modifier le code :

NodeFilter innerFilter = new TagNameFilter ("DIV");
NodeFilter filter = new HasChildFilter(innerFilter);
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Copier après la connexion

Résultat de sortie :

getText:body 
=================================================
getText:div id="top_main"
=================================================
Copier après la connexion

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)
Copier après la connexion


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 );
Copier après la connexion


Résultat de sortie :

getText:html xmlns="http://www.w3.org/1999/xhtml"
=================================================
getText:body 
=================================================
getText:div id="top_main"
=================================================
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

Résultat de sortie :

什么也没有输出。
Copier après la connexion



Méthode d'appel 2 :

NodeFilter filter = new HasAttributeFilter( "id" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Copier après la connexion

Résultat de sortie :

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Copier après la connexion
Copier après la connexion

Méthode d'appel 3 :

NodeFilter filter = new HasAttributeFilter( "id", "logoindex" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Copier après la connexion

Résultat de sortie :

getText:div id="logoindex"
=================================================
Copier après la connexion

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);
}
Copier après la connexion

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);
Copier après la connexion


4.2 StringFilter

Ce filtre est utilisé pour filtrer les balises qui contiennent le contenu spécifié dans la chaîne affichée. et le contenu de la chaîne non affichable (comme les commentaires, les liens, etc.) ne sera pas affiché
getText:这是注释
=================================================
可以看到只有RemarkNode(注释)被输出了。
Copier après la connexion
Modifiez l'exemple de code :




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>
Copier après la connexion

Résultats de sortie :

NodeFilter filter = new StringFilter("www.baizeju.com");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Copier après la connexion

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.

4.3 LinkStringFilter
getText:白泽居-title-www.baizeju.com
=================================================
getText:
白泽居-字符串1-www.baizeju.com
=================================================
getText:白泽居-链接文本-www.baizeju.com
=================================================
getText:
白泽居-字符串2-www.baizeju.com
=================================================
Copier après la connexion
Ce filtre est utilisé pour déterminer si le lien contient une chaîne spécifique et peut être utilisé pour filtrer les liens pointant vers un site Web spécifique.

Code de test :



Résultat de sortie :

NodeFilter filter = new LinkStringFilter("www.baizeju.com");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
Copier après la connexion

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"
=================================================
Copier après la connexion
Les filtres introduits précédemment sont tous des filtres simples, qui ne peuvent filtrer que pour un seul type de condition. HTMLParser prend en charge la combinaison de types simples de filtres pour implémenter des conditions complexes. Le principe est le même que le fonctionnement logique des langages de programmation généraux.

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);
Copier après la connexion

3.2 OrFilter
Remplacer le AndFilter précédent par OrFilter

Code de test :
getText:div id="logoindex"
=================================================
Copier après la connexion



Résultat de sortie :

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new OrFilter(filterID, filterChild);
Copier après la connexion

3.3 NotFilter
Remplacer le AndFilter précédent par NotFilter

Code de test :
getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
Copier après la connexion



Résultat de sortie :

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
Copier après la connexion

À l'exception des quelques balises sorties dans la version 3.2 précédente, le reste des balises est ici.

3.4 XorFilter
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:
=================================================
Copier après la connexion
Remplacer le AndFilter précédent par NotFilter

Code de test :



Résultat de sortie :

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new XorFilter(filterID, filterChild);
Copier après la connexion

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

2.1 TagNameFilter
getText:div id="top_main"
=================================================
Copier après la connexion
TabNameFilter est le filtre le plus simple à comprendre, filtrant en fonction du nom de la balise.


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>
Copier après la connexion

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


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal