使用Jsoup解析嵌套的HTML无序列表

时间:2014-01-03 15:09:05

标签: java html-parsing html-lists jsoup

我正在使用嵌套的无序列表解析HTML文件,这是一个示例:

<ul>
    <li class="category_x">xyz abc
        <ul>
            <li>foo 123 bar</li>
            <li>456 bar foo</li>
        </ul>
    </li>
    <li class="category_x">aaa bbb ccc
        <ul>
            <li>xxx yyy zzz</li>
            <li>123 abc 456</li>
        </ul>
    </li>
</ul>

我对关系li > ul > li感兴趣(将其视为Element类型的Jsoup对象:grandParentNode&gt; parentNode&gt; eNode),但是使用方法grandParentNode.text()我还得到整个嵌套<ul>列表中的文本(包括eNode.text())。

    // getting the triplets
    Elements triplets = doc.select("li > ul > li");

    // print the triplet
    for (Element eNode : triplets)
    {
        Element parentNode = eNode.parent();
        Element grandParentNode = parentNode.parent();

        System.out.println("Current node: " + eNode.text());
        System.out.println("Grand parent: " + grandParentNode.text());
    }

输出结果为:

Current node: foo 123 bar
Grand parent: xyz abc foo 123 bar 456 bar foo
Current node: 456 bar foo
Grand parent: xyz abc foo 123 bar 456 bar foo
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456
Current node: 123 abc 456
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456

我希望它是:

Current node: foo 123 bar
Grand parent: xyz abc
Current node: 456 bar foo
Grand parent: xyz abc
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc
Current node: 123 abc 456
Grand parent: aaa bbb ccc

看一下Jsoup文档,似乎我需要修改HTML以便将这些字符串包含在类似value=""属性的内容中,但我无法修改HTML ... 除此之外,所有<li class="category_x">都会在每个节点上重复使用相同的值,而不是树的“li叶子”,因此它们对过滤数据没有多大帮助。

我已经尝试了类似doc.select("li:lt(1) > ul > li");的内容,但它不起作用,问题是HTML的结构以及我如何使用Jsoup的text()类中的方法Element。问题是我不知道如何避免text()

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

使用ownText()方法仅选择元素直接拥有的文本,忽略任何子元素的文本。

所以改变这一行:

System.out.println("Grand parent: " + grandParentNode.text());

System.out.println("Grand parent: " + grandParentNode.ownText());

输出现在将显示:

Current node: foo 123 bar
Grand parent: xyz abc
Current node: 456 bar foo
Grand parent: xyz abc
Current node: xxx yyy zzz
Grand parent: aaa bbb ccc
Current node: 123 abc 456
Grand parent: aaa bbb ccc