编辑:似乎是 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/