2

假设我有这个 html:

<!-- some comment -->
<div class="someDiv">
... other html
</div>
<!-- some comment 2 -->
<div class="someDiv">
... other html
</div>

我目前正在获取 class == someDiv 的所有 div 并抓取它们以获取信息。为此,我只是这样做:

Document doc = Jsoup.connect(url).get();
Elements elements = doc.select(".someDiv");
for (Element element : elements) {
    //scrape stuff
}

在 for 循环中,有没有办法在我所在的特定 div.someDiv 元素之前找到评论标签?

如果这是不可能的,我是否应该根据这个要求以不同的方式解析这个 html 结构?

感谢您的任何建议。

4

3 回答 3

4

虽然这个问题已经存在几个月了,但我的回答是为了完整性。如何使用previousSibling来获得前面的Node. 当然,在你可能想要检查的真实代码中,你是否真的得到了一个Comment

String html = "<!-- some comment --><div class=\"someDiv\">... other html</div><!-- some comment 2 --><div class=\"someDiv\">... other html</div>";
Document doc = Jsoup.parseBodyFragment(html);
Elements elements = doc.select(".someDiv");
for (Element element : elements) {
    System.out.println(((Comment) element.previousSibling()).getData());
}

这会产生:

some comment 
some comment 2 

(使用 jsoup 1.6.1 和 1.6.3 测试)

于 2012-08-16T12:36:44.147 回答
2

尝试这样的事情,遍历所有评论并检查他们的兄弟姐妹是否是你所追求的 div

for (int i = 0; i < doc.childNodes().size(); i++) {
        Node child = doc.childNode(i);
        if (child.nodeName().equals("#comment")) {
            //do some checking on child.nextSibling() , like hasAttr or attr to figure out if it the div you were expecting for...
        }
}

查看jsoup 节点文档

于 2012-06-27T06:31:21.833 回答
0

元素元素 = doc.select("div.someDiv");

http://jsoup.org/cookbook/

于 2012-06-27T06:02:23.820 回答