嗨,我正在尝试用 Jsoup 解析整堆 html,但无法达到预期的目标。 我正在从生成的 javadoc 中解析它,该文档缺乏 ids 或其他有助于解析的元素。另一个问题是我必须解析同一个文档中的相同标签,所以我不能严格定义选择。我设法做到了,但仍然存在方法名称问题,该名称位于 DOM 的另一个同级中。这是我的 html 和所需的解析结果:http://img62.imageshack.us/img62/9870/08bz.png
我必须以某种方式“绑定(bind)”“pre”和“ol”标签(解析所需的 html 范围)。请帮助我。
尝试这样做: Elements methodName = doc.select("pre:contains(public), dl > dd > ol");
但这给我返回了太多的方法名称。
最佳答案
如果我理解正确的话,你只需要 public void method_name()
以及解释该方法的作用的列表项,但没有任何附加的 html 标签。
Elements methodName = doc.select("pre:contains(public), dl > dd > ol > li");
这将总共选择 4 个元素 - 方法名称和三个列表项,但它们周围仍然有 html 标签,例如 <pre>
和<li>
。调用text()
每个元素上的方法来删除这些标签:
for (Element e : methodName) {
System.out.println(e.text());
}
哪些输出:
11-08 10:47:19.468: I/System.out(816): public void test()
11-08 10:47:19.468: I/System.out(816): Navigates to app
11-08 10:47:19.468: I/System.out(816): opens main panel
11-08 10:47:19.478: I/System.out(816): starts it
<小时/>
由于缺少任何 id 属性,我认为不可能通过一个 select 语句仅选择相关标签。因此,您可以迭代 Elements
您确实选择并检查是否有 <pre>
标签后跟 <li>
标签(假设您使用与我在第一个答案中使用的相同的 doc.select()
语句)。
示例:
Elements methodName = doc.select("pre:contains(public), dl > dd > ol > li");
for (int i = 0; i < methodName.size(); i++) {
if (methodName.get(i).tagName().equals("pre")) { // if the <pre> tag
if (methodName.get(i + 1).tagName().equals("li")) { // is followed by a <li> tag
System.out.println(methodName.get(i).text()); // print it
}
} else System.out.println(methodName.get(i).text()); // else it is a <li> tag so print it
}
这将提供与我的第一个示例相同的输出,即使还有其他两个 <pre>
methodNames 没有 <ol>
的标签列出以下内容(正如您在评论中提到的)。
注意:根据文档的格式,您可能需要注意 IndexOutOfBoundsException
(当我调用 i + 1
时),但您可以为此添加另一个检查。
关于java - 如何使用Jsoup解析给定选择范围内的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19838423/