2

変更できない Web サイトの HTML を解析する必要があります。Jスープを使用しています。

ここにいくつかのhtmlがあります:

<th></th>
<td> <!-- <td> tags on a high level in the hierarchy. -->
  <table>
    <tbody>
       <tr>
         <td></td> <!-- <td> tags on a low level in the hierarchy. -->
         <td></td>
         <td></td>
       </tr>
    </tbody>
  </table>
</td>
<td></td>
<td></td>

やりたかったのですelementname.getElemementsByTag("td");が、このメソッドはすべて<td>のタグを取得しますが、階層の上位レベルのタグのみを取得<td>し、階層の下位レベルのタグをスキップしたいです。誰もそれを行う方法を知っていますか?

すべての助けに感謝します。

4

2 に答える 2

3

Jsoup を使用すると、CSS セレクターを介して要素を取得できますdocument.selector("CSS SELECTOR")

tda の直接の子が必要な場合は、直接の子を意味するCSS セレクターtableを使用できます。あなたの場合、次を使用する必要があります。>

#tableID > tbody > tr > td

これにより、 のすべての第 1 レベルtdのが取得されます#tableID table。注意すべき点:

  • 真ん中に入れる必要があります。> tbody > tr元の HTML マークアップにそれらがない場合でも、Jsoup は HTML を解析するときにそれらを作成します。
  • 最初の部分で ID を取得する必要はありません。あなたは何でも持つことができます。たとえば、クラス:を持つtdすべての のすべての最初のレベル。table.prettytable.pretty > tbody > tr > td

Jsoup で:

  • Elements tds = document.select("#tableID > tbody > tr > td");
  • または、最初にテーブルを選択する場合 (または以前に選択したことがある場合):
    • Element myTable = document.select("#tableID");
    • Elements tds = myTable.select(" > tbody > tr > td");

最後になりましたが、例TDから s を取得するサンプルコード:

import org.jsoup.Jsoup;
import org.jsoup.nodes.*;
import org.jsoup.select.*;

public class JsoupHtmlDirectChildren {
    public static void main(String[] args) {
        String html = "" +
                "<html>                                                                  " +
                "  <body>                                                                " +
                "    <span>HELLO!</span>                                                 " +
                "    <table id=\"myTable\">                                              " +
                "      <tbody>                                                           " +
                "        <tr>                                                            " +
                "          <th>header</th>                                               " +
                "          <!-- <td> tags on a high level in the hierarchy. -->          " +
                "          <td>high level1                                               " +
                "            <table>                                                     " +
                "              <tbody>                                                   " +
                "                <tr>                                                    " +
                "                  <!-- <td> tags on a low level in the hierarchy. -->   " +
                "                  <td>low level1</td>                                   " +
                "                  <td>low level2</td>                                   " +
                "                  <td>low level3</td>                                   " +
                "                </tr>                                                   " +
                "              </tbody>                                                  " +
                "            </table>                                                    " +
                "          </td>                                                         " +
                "          <td>high level2</td>                                          " +
                "          <td>high level3</td>                                          " +
                "        </tr>                                                           " +
                "      </tbody>                                                          " +
                "    </table>                                                            " +
                "  </body>                                                               " +
                "</html>                                                                 ";
        Document doc = Jsoup.parse(html);
        // all first level children TD of the #myTable table
        Elements highLevelTDs = doc.select("#myTable > tbody > tr > td");
        System.out.println("QUANTITY FOUND: "+highLevelTDs.size());
        for (Element td : highLevelTDs) {
            System.out.println("\n\n###HIGH LEVEL TD: "+td);
        }
    }
}

出力:

QUANTITY FOUND: 3

###HIGH LEVEL TD: <td>high level1 
 <table> 
  <tbody> 
   <tr> 
    <!-- <td> tags on a low level in the hierarchy. --> 
    <td>low level1</td> 
    <td>low level2</td> 
    <td>low level3</td> 
   </tr> 
  </tbody> 
 </table> </td>

###HIGH LEVEL TD: <td>high level2</td>

###HIGH LEVEL TD: <td>high level3</td>
于 2013-06-30T07:15:44.500 に答える
0

あなたがご覧になっているサイトには、ここで示したものではなく、詳細な HTML マークアップが含まれていることを願っています。

タグにクラス、ID、またはその他の属性などの記述子がある場合、それらを使用して、Elements関心のあるそれぞれをフィルタリングできます。

たとえば。クラス属性が「高」のすべての<td>要素を取得するには、次のようにすることができます。

Elemenets highTDElements = rootElementName.select("td.high");

セレクター構文の詳細は公式サイトにありますが、これは属性/ID/クラスなどの記述子がある場合にのみ役立ちます。

そうしないと、DOM トラバーサルによって制限され、要素がどこにあるかを正確に把握する必要があります。

于 2013-06-30T06:47:42.623 に答える