2012-01-05 16 views
1

私はJsoupで解析しているHTMLブロックを持っていますが、そのすべてが関連しているわけではなく、無関係な部分を解析するとデータセットが破棄されます。Jsoupは指定されたタグの解析を開始するか、ページの下から開始しますか?

サイトには、いつでも変更できるヘッダーがあります。このヘッダーにはリンクはありますが、私が気にしないリンクです。 Jsoupがドキュメントを解析するとき、Jsoupはそれらの考えをリンク配列に追加し、自分の値を投げ捨てます。

私が興味を持っているHTMLは、 <!-- BEGIN TOPICS --> タグの後に続きます。

私はJsoupにそのタグの上のすべてを無視するように指示したいと思います。これは可能ですか?そうでない場合は、ドキュメントの最後に解析を開始してこの問題を回避することができますが、どのようにすればよいかわかりません。

My Jsoupのクエリは次のとおりです。であることがすべてコメントアウト行とデバッグ文を無視してください、私はしばらくの間、これをうまくしようとすると、まだでテストコードを持ってきました。

 Thread getTitlesThread = new Thread() { 
      public void run() { 
       TitleResults titleArray = new TitleResults(); 
       StringBuilder whole = new StringBuilder(); 

       try { 
        URL url = new URL(
          Constants.FORUM); 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 
        try { 
         BufferedReader in = new BufferedReader(
          new InputStreamReader(new BufferedInputStream(urlConnection.getInputStream()))); 
         String inputLine; 
         while ((inputLine = in.readLine()) != null) 
          whole.append(inputLine); 
         in.close(); 
        } catch (IOException e) {} 
        finally { 
         urlConnection.disconnect(); 
        } 
       } catch (Exception e) {} 
       Document doc = Parser.parse(whole.toString(), Constants.FORUM); 
       Elements threads = doc.select("TOPICS > .topic_title"); 
       Elements authors = doc.select("a[hovercard-ref]"); 
//    for (Element author : authors) { 
//     authorArray.add(author.text()); 
//    } 
//    cleanAuthors(); 
       if (threads.isEmpty()) { 
        Log.d("POC", "EMPTY BRO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11"); 
       } 
//    for (Element thread : threads) { 
//     titleArray = new TitleResults(); 
//     Log.d("POC", thread.toString()); 
// 
//     titleArray.setAuthorDate(authorArray.get(0)); 
//     authorArray.remove(0); 

        //Thread title 
//     threadTitle = thread.text(); 
//     titleArray.setItemName(threadTitle); 
//     
//     //Thread link 
//     String threadStr = thread.attr("abs:href"); 
//     String endTag = "/page__view__getnewpost"; //trim link 
//     threadStr = new String(threadStr.replace(endTag, "")); 
//     threadArray.add(threadStr); 
//     results.add(titleArray); 
//    } 
      } 
     }; 
     getTitlesThread.start(); 
+0

ドキュメントドキュメント= Parser.parse(whole.toString()。replaceAll( "<! - end広告タグ - >?*?<! - BEGIN TOPICS '<! - end ad tag - >'は無視したい部分の始まりであり、 '<! - BEGIN TOPICS - > '終わりだった。 – r2DoesInc

答えて

0

あなたが解析したくない文書の一部を削除します私は無視したいと<!-- BEGIN TOPICS -->最後でした。

+0

Constants.FORUMとは何ですか?適切なjavadocまたは何かにリンクできますか? – Sparker0i

1

これは動作するはず、与えられたあなたの説明を(ハード特定の)実際のHTMLの入力なし:

Document doc = Parser.parse(whole.toString().replaceAll("<!-- end ad tag -->?.*?<!-- BEGIN TOPICS -->", ""), Constants.FORUM); 

<!-- end ad tag -->が義和の始まりだった:

Document document = ...; 
    Elements elements = document.getAllElements(); 
    Element comment = null; 
    int size = elements.size(); 
    for (int i = 0; comment == null && i < size; i++) { 
     Element element = elements.get(i); 
     for (Node node : element.childNodes()) { 
      if (node instanceof Comment) { 
       String str = ((Comment) node).getData().trim(); 
       if ("BEGIN TOPICS".equals(str)) { 
        comment = element; 
        break; 
       } 
      } 
     } 
    } 

    // Did we find <-- BEGIN TOPICS -->? 
    if (comment != null) { 
     // You can now select from the siblingElements of comment 
     // and only get stuff "after" that comment: 
     // e.g. Elements e = comment.siblingElements().select("a"); 
    } else { 
     // Oh snap. 
    } 
+0

私が質問にしたコメントをチェックすると、要素を解析する前に、私が望んでいなかったものをすべて削除してしまいました。残念ながら、私の担当者は、自分の質問にさらに7時間お答えするのに十分ではありません。 – r2DoesInc

関連する問題