如何在给定的选择范围内使用Jsoup解析元素?

时间:2013-11-07 14:28:01

标签: java parsing jsoup

您好我正在尝试用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"); 但这会给我带来太多的方法名称。

1 个答案:

答案 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时),但您可以添加另一项检查。