ホームページ > ウェブフロントエンド > htmlチュートリアル > HTMLParserの使い方を詳しく解説(3)

HTMLParserの使い方を詳しく解説(3)

黄舟
リリース: 2016-12-29 15:57:20
オリジナル
1209 人が閲覧しました

HTMLParser は Web ページのコンテンツを走査した後、結果をツリー (フォレスト) 構造に保存します。 HTMLParser が結果コンテンツにアクセスするには 2 つの方法があります。フィルターを使用し、訪問者を使用します。

(1) Filterクラス
Filterはその名の通り、結果をフィルタリングして必要な内容を取得するクラスです。 HTMLParser は、org.htmlparser.filters パッケージで合計 16 の異なるフィルターを定義します。これらのフィルターは、いくつかのカテゴリに分類することもできます。
判定クラス Filter:

TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
ログイン後にコピー

論理演算 Filter:

AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
ログイン後にコピー

すべての Filter クラスは org.htmlparser.NodeFilter インターフェースを実装しています。このインターフェースのメイン関数は 1 つだけです:

boolean accept (Node node);
ログイン後にコピー

(2) 判定クラス FilterHTMLParser の使用開始 (2) - ノードの内容、インポート部分を自分で追加します)

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();
}
}
ログイン後にコピー

出力結果:

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
ログイン後にコピー
ログイン後にコピー

が表示されます。ファイル内の 2 つの Div すべてのノードが取り出されています。これら 2 つの DIV ノードに対して次の操作を実行できます

2.2 HasChildFilter
HasChildFilter を見てみましょう。このフィルターを見たとき、このフィルターが子を持つタグを返すのが当然だと思いました。

NodeFilter filter = new HasChildFilter();
ログイン後にコピー

を直接初期化しました 変更コード:

NodeFilter innerFilter = new TagNameFilter ("DIV");
NodeFilter filter = new HasChildFilter(innerFilter);
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

出力結果:

getText:body 
=================================================
getText:div id="top_main"
=================================================
ログイン後にコピー

ご覧のとおり、出力は DIV サブタグを持つ 2 つのタグ ノードです。 (本文には子ノード DIV "top_main" があり、"top_main" には子ノード "logoindex" があります。

HasChildFilter にはコンストラクターもあることに注意してください:

public HasChildFilter (NodeFilter filter, boolean recursive)
ログイン後にコピー


recursive が false の場合、最初のレベルの子のみたとえば、前の例では、body と top_main の両方が第 1 レベルの子ノードに DIV ノードを持っているため、次のメソッドを使用して呼び出すと、出力は次のようになります。

NodeFilter filter = new HasChildFilter( innerFilter, true );
ログイン後にコピー

わかりました。出力結果に追加の html xmlns="http://www.w3.org/1999/xhtml" があることがわかります。これは HTML ページ全体のノード (ルート ノード) です。このノードの直下には DIV ノードはありませんが、子ノード本体の下に DIV ノードがあるため、これも一致します。

2.3 HasAttributeFilter

HasAttributeFilter には 3 つのコンストラクターがあります:


getText:html xmlns="http://www.w3.org/1999/xhtml"
=================================================
getText:body 
=================================================
getText:div id="top_main"
=================================================
ログイン後にコピー

このフィルターは、指定された属性を含む属性と一致します。

メソッドの呼び出し 1:

public HasAttributeFilter ();
public HasAttributeFilter (String attribute);
public HasAttributeFilter (String attribute, String value);
ログイン後にコピー

結果の呼び出し:

NodeFilter filter = new HasAttributeFilter();
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

出力結果:


什么也没有输出。
ログイン後にコピー

メソッド3の呼び出し:

NodeFilter filter = new HasAttributeFilter( "id" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

出力結果:

getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
ログイン後にコピー
ログイン後にコピー

とても簡単です笑


2.4 他の判定列Filter

HasParentFilterとHasSiblingFilterの機能はHasChildFilterと似ているので試してみると分かると思います。


IsEqualFilter のコンストラクター パラメーターはノードです:

NodeFilter filter = new HasAttributeFilter( "id", "logoindex" );
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

あまり説明する必要はありません

(3) 論理演算フィルター (4) その他のフィルター: HTMLParser の入門 (2) - ノードの内容さまざまなタイプのノードについてすでに学習しており、このフィルターはタイプによってフィルターできます。
テストコード:

getText:div id="logoindex"
=================================================
ログイン後にコピー

出力結果:

public IsEqualFilter (Node node) {
mNode = node;
}
accept函数也很简单:
public boolean accept (Node node) {
return (mNode == node);
}
ログイン後にコピー

4.2 StringFilter

このフィルターは、表示内の指定されたコンテンツを含むタグをフィルターするために使用されます。文字列は表示可能な文字列であり、文字列内の内容 (コメント、リンクなど) は表示されないことに注意してください。

NodeFilter filter = new NodeClassFilter(RemarkNode.class);
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

テスト コード:

getText:这是注释
=================================================
可以看到只有RemarkNode(注释)被输出了。
ログイン後にコピー

出力結果:

<!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>
ログイン後にコピー

文字列のタグとリンク文字列は出力されていますが、コメントとリンクタグ自体は出力されていないことがわかります。リンクに特定の文字列が含まれているかどうかを判断するために使用され、特定の Web サイトへのリンクを除外するために使用できます。
テストコード:

NodeFilter filter = new StringFilter("www.baizeju.com");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

出力結果:


getText:白泽居-title-www.baizeju.com
=================================================
getText:
白泽居-字符串1-www.baizeju.com
=================================================
getText:白泽居-链接文本-www.baizeju.com
=================================================
getText:
白泽居-字符串2-www.baizeju.com
=================================================
ログイン後にコピー

4.4 他のいくつかのフィルター

他のいくつかのフィルターも、文字列に基づいてさまざまなフィールドを判断します。これまでのものとの主な違いは、正規表現をサポートしていることです。これはこの記事の範囲を超えていますので、ご自身で試してみてください。

以前に紹介したものは、単一タイプの条件のみをフィルターできる単純なフィルターです。 HTMLParser は、複雑な条件を実装するための単純なタイプのフィルターの組み合わせをサポートしています。原理は一般的なプログラミング言語の論理演算と同じです。

3.1 AndFilter
AndFilter は 2 種類のフィルターを組み合わせることができ、同時に条件を満たすノードのみがフィルターされます。
テストコード:

NodeFilter filter = new LinkStringFilter("www.baizeju.com");
NodeList nodes = parser.extractAllNodesThatMatch(filter);
ログイン後にコピー

出力結果:

getText:a href="http://www.baizeju.com"
=================================================
ログイン後にコピー

3.2 OrFilter

前のAndFilterをOrFilterに置き換えます

テストコード:

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new AndFilter(filterID, filterChild);
ログイン後にコピー

出力結果:

getText:div id="logoindex"
=================================================
ログイン後にコピー

3.3 NotFilter
を置き換えます以前の AndFilter と NotFilter

Testコード:


NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new OrFilter(filterID, filterChild);
ログイン後にコピー

出力結果:


getText:div id="top_main"
=================================================
getText:div id="logoindex"
=================================================
ログイン後にコピー

以前の 3.2 で出力されたいくつかのタグを除いて、残りのタグはここにあります。

3.4 XorFilter

以前の AndFilter を NotFilter に置き換えます
テストコード:

NodeFilter filterID = new HasAttributeFilter( "id" );
NodeFilter filterChild = new HasChildFilter(filterA);
NodeFilter filter = new NotFilter(new OrFilter(filterID, filterChild));
ログイン後にコピー

出力結果:

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:
=================================================
ログイン後にコピー

4.1 NodeClassFilter

このフィルターは、ノード タイプが特定のノード タイプであるかどうかを判断するために使用されます。
2.1 TagNameFilter

TabNameFilter は、タグの名前に基づいてフィルタリングする、最も理解しやすいフィルターです。


テストに使用される HTML ファイルは次のとおりです:

<!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中文网(m.sbmmt.com)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート