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
getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText:body ================================================= getText:div id="top_main" =================================================
public HasAttributeFilter (); public HasAttributeFilter (String attribute); public HasAttributeFilter (String attribute, String value);
NodeFilter filter = new HasAttributeFilter(); NodeList nodes = parser.extractAllNodesThatMatch(filter);
什么也没有输出。
NodeFilter filter = new HasAttributeFilter( "id" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
2.4 他の判定列Filter
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); }
このフィルターは、表示内の指定されたコンテンツを含むタグをフィルターするために使用されます。文字列は表示可能な文字列であり、文字列内の内容 (コメント、リンクなど) は表示されないことに注意してください。
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 =================================================
他のいくつかのフィルターも、文字列に基づいてさまざまなフィールドを判断します。これまでのものとの主な違いは、正規表現をサポートしていることです。これはこの記事の範囲を超えていますので、ご自身で試してみてください。
3.1 AndFilter
AndFilter は 2 種類のフィルターを組み合わせることができ、同時に条件を満たすノードのみがフィルターされます。
テストコード:
NodeFilter filter = new LinkStringFilter("www.baizeju.com"); NodeList nodes = parser.extractAllNodesThatMatch(filter);
getText:a href="http://www.baizeju.com" =================================================
テストコード:
NodeFilter filterID = new HasAttributeFilter( "id" ); NodeFilter filterChild = new HasChildFilter(filterA); NodeFilter filter = new AndFilter(filterID, filterChild);
getText:div id="logoindex" =================================================
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" =================================================
以前の 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: =================================================
このフィルターは、ノード タイプが特定のノード タイプであるかどうかを判断するために使用されます。
2.1 TagNameFilter
テストに使用される 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)!