[英]How to parse elements with Jsoup in given select range?
嗨,我正在尝试使用Jsoup解析整堆html,但是无法达到预期的目标。 我是从生成的javadoc解析它的,因为它缺少id或其他有用的元素来进行解析。 另外一个问题是我必须解析同一文档中的相同标签,因此我不能严格定义选择。 我设法做到了,但是方法名称仍然有问题,这在DOM的另一个同级中。 这是我的html和所需的解析结果: http : //img62.imageshack.us/img62/9870/08bz.png
我必须以某种方式“绑定”“ 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>
。 在每个Element上调用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
),但是您可以为此添加另一个检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.