繁体   English   中英

如何使用 jsoup 定位直接放置在 tr-tag 中的 div-tag

[英]How to locate div-tag placed directly in tr-tag using jsoup

这是问题场景

<html>
    <body>
        <div class="specalClass">
            <table>
            <tbody id="mainTable">
                <tr><td>data 1</td></tr>
                <tr><div>Data</div></tr>
            </tbody>
            </table>
        </div>
    </body>
</html>

有一个问题,如何获取直接放在tr标签中的div ,除了这个div之外,所有元素都是可追溯的。 这只是一个示例代码:我们不能直接使用 XPath 或 div-tag,因为真实页面很大。 我们可以通过它的 id 获取这个表,然后需要对其进行迭代。

您可以使用 CSS 选择器来获取div ,它是 id mainTable的表中tr的直接子代:

    doc.select("#mainTable tr>div");

但这不起作用,因为我们这里还有另一个问题。
tr中不允许使用div ,因此 Jsoup 的 HTML 解析器将其删除,因为它遵循标准。 要跳过 HTML 验证,您应该使用 XML 解析器解析文档:

    Document doc = Jsoup.parse(html, "", Parser.xmlParser());

它将保留原始结构,现在div将可以访问。

编辑:
为了反驳发布无效答案的指控,我将使用 HTML 和 XML 解析器的 output 粘贴整个代码。
第一个示例不起作用,但根据我的回答,第二个示例可以正常工作:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.parser.Parser;

public class Stackoverflow62376512 {

    public static void main(final String[] args) {
        String html = "<html>\n" + 
                "    <body>\n" + 
                "        <div class=\"specalClass\">\n" + 
                "            <table>\n" + 
                "            <tbody id=\"mainTable\">\n" + 
                "                <tr><td>data 1</td></tr>\n" + 
                "                <tr><div>Data</div></tr>\n" + 
                "            </tbody>\n" + 
                "            </table>\n" + 
                "        </div>\n" + 
                "    </body>\n" + 
                "</html>";

        Document doc = Jsoup.parse(html, "", Parser.htmlParser()); // same as Jsoup.parse(html);
        System.out.println("Document parsed with HTML parser (div inside tr will be dropped): " + doc);
        System.out.println("Selecting div (this will fail and show null): " + doc.select("#mainTable tr>div").first());

        System.out.println("\n-------------\n");

        doc = Jsoup.parse(html, "", Parser.xmlParser());
        System.out.println("Document parsed with XML parser (div inside tr will be kept): " + doc);
        System.out.println("Selecting div (this one will succeed): " + doc.select("#mainTable tr>div").first());

    }
}

output 是:

Document parsed with HTML parser (div inside tr will be dropped): <html>
 <head></head>
 <body> 
  <div class="specalClass"> 
   <div>
    Data
   </div>
   <table> 
    <tbody id="mainTable"> 
     <tr>
      <td>data 1</td>
     </tr> 
     <tr></tr> 
    </tbody> 
   </table> 
  </div>  
 </body>
</html>
Selecting div (this will fail and show null): null

-------------

Document parsed with XML parser (div inside tr will be kept): <html> 
 <body> 
  <div class="specalClass"> 
   <table> 
    <tbody id="mainTable"> 
     <tr>
      <td>data 1</td>
     </tr> 
     <tr>
      <div>
       Data
      </div>
     </tr> 
    </tbody> 
   </table> 
  </div> 
 </body> 
</html>
Selecting div (this one will succeed): <div>
 Data
</div>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM