2

我正在尝试使用 Jsoup 解析 Javadocs,但无法提取包含在blockquote标签中的文本。

这是我尝试解析的 HTML 示例:

<P>
The <code>String</code> class represents character strings. All
 string literals in Java programs, such as <code>"abc"</code>, are
 implemented as instances of this class.
 <p>
 Strings are constant; their values cannot be changed after they
 are created. String buffers support mutable strings.
 Because String objects are immutable they can be shared. For example:
 <p><blockquote><pre>
     String str = "abc";
 </pre></blockquote><p>
 is equivalent to:
 <p><blockquote><pre>
     char data[] = {'a', 'b', 'c'};
     String str = new String(data);
 </pre></blockquote><p>
 Here are some more examples of how strings can be used:
 <p><blockquote><pre>
     System.out.println("abc");
     String cde = "cde";
     System.out.println("abc" + cde);
     String c = "abc".substring(2,3);
     String d = cde.substring(1, 2);
 </pre></blockquote>
 <p>

我正在尝试使用此代码来解析p标签中包含的文本:

        Document doc = Jsoup.parse(new File("/home/facetoe/ebooks/Java/docs/api/java/lang/String.html"), "UTF-8");
        Elements para = doc.getElementsByTag("P");

        for ( Element element : para ) {
            System.out.println(element);
        }

但是,无论我尝试什么,blockquote标签中包含的文本都会消失。

这是我得到的输出示例:

<p> The <code>String</code> class represents character strings. All string literals in Java programs, such as <code>&quot;abc&quot;</code>, are implemented as instances of this class. </p>
<p> Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example: </p>
<p></p>
<p> is equivalent to: </p>
<p></p>
<p> Here are some more examples of how strings can be used: </p>
<p></p>
<p> The class <code>String</code> includes methods for examining individual characters of the sequence, for comparing strings, for searching strings, for extracting substrings, and for creating a copy of a string with all characters translated to uppercase or to lowercase. Case mapping is based on the Unicode Standard version specified by the <a href="../../java/lang/Character.html" title="class in java.lang"><code>Character</code></a> class. </p>
<p> The Java language provides special support for the string concatenation operator (&nbsp;+&nbsp;), and for conversion of other objects to strings. String concatenation is implemented through the <code>StringBuilder</code>(or <code>StringBuffer</code>) class and its <code>append</code> method. String conversions are implemented through the method <code>toString</code>, defined by <code>Object</code> and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, <i>The Java Language Specification</i>. </p>
<p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor or method in this class will cause a <a href="../../java/lang/NullPointerException.html" title="class in java.lang"><code>NullPointerException</code></a> to be thrown. </p>
<p>A <code>String</code> represents a string in the UTF-16 format in which <em>supplementary characters</em> are represented by <em>surrogate pairs</em> (see the section <a href="Character.html#unicode">Unicode Character Representations</a> in the <code>Character</code> class for more information). Index values refer to <code>char</code> code units, so a supplementary character uses two positions in a <code>String</code>. </p>
<p>The <code>String</code> class provides methods for dealing with Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e., <code>char</code> values). </p>
<p> </p>

就像 Jsoup 只是将任何东西放在blockquote标签中。有谁知道我如何保留这些标签并从中提取文本?

4

3 回答 3

1

原因是 Jsoup 构建 DOM 使得块引用元素位于段落之外。您可以通过打印 doc 对象来看到这一点。我认为 blockquote 元素会自动终止前一个 p 元素(不需要关闭 p 标签)。如果您在现代浏览器中加载 html 并检查元素,您可以观察到同样的情况。

另请参阅HTML 4.01 规范- “P 元素表示一个段落。它不能包含块级元素(包括 P 本身)。” 我敢肯定 HTML5 中也有类似的东西。

因此,通过仅遍历段落,您会丢失不包含在其中的块引用。

于 2013-09-26T20:01:34.733 回答
0

您没有关闭 <p> 标签,这可能是问题所在。

于 2013-09-26T14:18:00.433 回答
0

查看 parse 方法的JSoup 文档,似乎他们使用白名单机制来决定什么是安全的,什么不是。也许您需要在解析之前设置一个 while 列表?虽然这似乎只适用于 clean 方法。所以它可能是别的东西。

于 2013-09-26T13:14:23.687 回答