解析HTML:使用JSOUP获取特定段落后的特定html定义列表

时间:2013-05-25 14:11:06

标签: java html parsing html-parsing jsoup

我正在尝试使用JSoup with Java在满足我的条件的特定标记之后获取定义列表(或任何标记)的内容。举个例子,我们假设我们有一个html文档如下。

<p>PageID: 2816; NS: 0; Title: some text; 
Image url: 
Content:
{{Wort der Woche}}
{{Siehe auch}}
</p>
<h2><span class="1" id="e1">some text</span></h2>
<h3><span class="1" id="e2">some text</span></h3>

<p>{{Transportation}}
</p>
<dl>
    <dd>Flying</dd>
    <dd>Driving</dd>
    <dd>Sailing
        <dl>
            <dd>Boat</dd>
            <dd>Ship</dd>
        </dl>
    </dd>
</dl>

<p>{{Activities}}
</p>
<dl>
    <dd>Shopping</dd>
    <dd>Painting</dd>
</dl>

假设我们想要获取“运输”之后出现的“dl”标签的内容。即内容:

<dl>
    <dd>Flying</dd>
    <dd>Driving</dd>
    <dd>Sailing
        <dl>
            <dd>Boat</dd>
            <dd>Ship</dd>
        </dl>
    </dd>
</dl>

我最初的尝试是获取段落的索引(例如1st,2nd等)然后得到相应的dl,但这似乎不起作用,因为dls可以嵌套。

是否有人建议如何获取此类内容?

1 个答案:

答案 0 :(得分:1)

假设HTML结构类似于您的示例,<dl>始终遵循<p>,您可以:

  • 通过 <p> ;
  • 获取所需的doc.getElementsContainingOwnText("txt")元素
  • 使用 <dl>
  • 获取以下element.nextElementSibling();

以下是处理HTML的示例代码:

public static void main(String[] args) {
    Document doc = Jsoup.parse("<p>PageID: 2816; NS: 0; Title: some text; \r\nImage url: \r\nContent:\r\n{{Wort der Woche}}\r\n{{Siehe auch}}\r\n</p>\r\n<h2><span class=\"1\" id=\"e1\">some text</span></h2>\r\n<h3><span class=\"1\" id=\"e2\">some text</span></h3>\r\n\r\n<p>{{Transportation}}\r\n</p>\r\n<dl>\r\n    <dd>Flying</dd>\r\n    <dd>Driving</dd>\r\n    <dd>Sailing\r\n        <dl>\r\n            <dd>Boat</dd>\r\n            <dd>Ship</dd>\r\n        </dl>\r\n    </dd>\r\n</dl>\r\n\r\n<p>{{Activities}}\r\n</p>\r\n<dl>\r\n    <dd>Shopping</dd>\r\n    <dd>Painting</dd>\r\n</dl>");
    Elements e = doc.getElementsContainingOwnText("{{Transportation}}");
    Element nextDL = e.get(0).nextElementSibling();
    System.out.println(nextDL);
}

输出:

<dl> 
    <dd>Flying</dd> 
    <dd>Driving</dd> 
    <dd>Sailing 
        <dl> 
            <dd>Boat</dd> 
            <dd>Ship</dd> 
        </dl> 
    </dd> 
</dl>