您好我正在尝试用Jsoup解析整堆html,但无法达到预期的目标。 我正在从生成的javadoc解析它,这是ids或其他有用的解析元素。另一个问题是我必须在同一个文档中解析相同的标签,所以我不能有严格定义的选择。我设法做到了,但仍然有方法名称的问题,这是在DOM的其他兄弟。这是我的html和所需的解析结果:http://img62.imageshack.us/img62/9870/08bz.png
我必须以某种方式“绑定”'pre'和'ol'标签(解析所需的html范围)。求你帮帮我。
尝试以这种方式执行此操作:Elements methodName = doc.select("pre:contains(public), dl > dd > ol");
但这会给我带来太多的方法名称。
答案 0 :(得分:1)
如果我理解正确,您只需要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
时),但您可以添加另一项检查。