java - Jsoup: "parentTag > childTag"匹配,但 "parentTag childTag"没有给出任何内容

标签 java jquery jsoup

编辑:似乎是 1.8.3 中的一个错误,它在 1.11.2 中按预期工作。

我正在尝试使用 Java 中的 jsoup 1.8.3 解析 html 文档。我不明白某些选择器的行为(它们应该类似于 jQuery 选择器)。

考虑以下最小示例(它应该从 StackOverflow 问题中选择代码片段):

package edu.example;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class App {
    public static void main(String[] args) throws Exception {
        Document doc = Jsoup.connect("http://stackoverflow.com/questions/48407833").get();
        Element question = doc.select("div#question div.post-text").first();
        Elements allChildren = question.children();
        Elements codeSnippets = allChildren.select("pre > code");
        System.out.println("code snippets start-----");
        System.out.println(codeSnippets);
        System.out.println("/code snippets end -----");
    }
}

我不明白的是:如果我将 pre > code 替换为 pre code,则所选元素的列表为空。为什么会出现这种情况?

如果我理解此页面:https://jsoup.org/cookbook/extracting-data/selector-syntax正确的话,那么

  • ancestor后代选择带有标签descendant的所有元素,这些元素源自带有标签ancestor的元素
  • parent > child 选择带有标签 child 的所有元素,这些元素直接源自带有标签 parent 的元素

父子关系是祖先-后代关系的特例(祖先-后代关系是父子关系的传递闭包)。第一个选择器怎么可能不严格匹配比第二个选择器更多的标签?

以下是相关 HTML 的摘录,如果您单击“查看页面源代码”,您将看到该内容:

<div class="question" data-questionid="48407833"  id="question">
   ...
    <div class="post-text" itemprop="text">
       ...
       <pre><code>package edu.example;
       ...

PS:如果您想快速构建一个小项目并尝试一下,这里有一个最小的 Maven pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>edu.example</groupId>
  <artifactId>jsoupselectorquestion</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>jsoupselectorquestion</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.8.3</version>
    </dependency>
  </dependencies>
</project>

最佳答案

原因是 1.8 中的一个错误。使用更实际的版本,例如改为 1.11.2。

关于java - Jsoup: "parentTag > childTag"匹配,但 "parentTag childTag"没有给出任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407833/

相关文章:

java - 在 AlertDialog 中调用方法时出错

java - 使用 libGDX 添加地面陷阱

java - 如何在 Spring MVC 中基于 Controller 和操作方法创建 URL?

javascript - 根据提供的 JQuery Snippet 修改 HTML

javascript - 如何获取点击记录的动态循环元素的id

java - 处理来自 Servlet 的 Jquery AJAX 响应中的异常

java - 通过 XSSFRichTexString 和 Jsoup 格式化 Apache POI Excel 文本

java - Scala 编译服务器 - VM 警告

java - 使用 JSoup 从网站源代码中提取 JavaScript 行

java - jsoup - 如何检查网页是否存在