0

我正在尝试使用JSoup从网站上抓取一些内容。以下是我感兴趣的页面中的一些示例 HTML 内容:

<div class="sep_top shd_hdr pb2 luna">
    <div class="KonaBody" style="padding-left:0px;">
        <div class="lunatext results_content frstluna">
            <div class="luna-Ent">
                <div class="header">
                <div class="body">
                    <div class="pbk">
                        <div id="rltqns">
                    <div class="pbk">
                        <span class="pg">
                            <span id="hotword">
                                <span id="hotword">Fizz</span>
                            </span>
                        </span>
                        <div class="luna-Ent">
                        <div class="luna-Ent">
                        <div class="luna-Ent">
                        <div class="luna-Ent">
                    </div>
                    <div class="pbk">
                        <span class="sectionLabel">
                        <span class="pg">
                            <span id="hotword">
                                <span id="hotword">Buzz</span>
                            </span>
                        </span>
                        <span class="pg">
                            <span id="hotword">
                                <span id="hotword">Foo</span>
                            </span>
                        </span>
                        <span class="pg">
                            <span id="hotword">
                                <span id="hotword">Bar</span>
                            </span>
                        </span>
                    </div>
                <div class="tail">
            </div>
            <div class="rcr">
        <!-- ... rest of content omitted for brevity -->

我有兴趣获取hotwords页面中所有内容的列表(例如“Fizz”、“Buzz”、“Foo”和“Bar”)。但我不能只查询hotword,因为他们到处使用hotword类来装饰许多不同的元素。具体来说,我需要元素hotwords中存在的所有pbk pg hotword内容。注意 pbks 可以包含 0+ pgs, pgs 可以包含 0+ hotwords, hotwords 可以包含 1+ other hotwords。我有以下代码:

// Update, per PShemo:
Document doc = Jsoup.connect("http://somesite.example.com").get();

System.out.println("Starting to crawl...");

// Get the document's .pbk elements.
Elements pbks = doc.select(".pbk");

List<String> hotwords = new ArrayList<String>();

System.out.println(String.format("Found %s pbks.", pbks.size()));
int pbkCount = 0;
for(Element pbk : pbks) {
    pbkCount++;

    // Get the .pbk element's .pg elements.
    for(Element pg : pbk.getElementsByClass("pg")) {
        System.out.println(String.format("PBK #%s has %s pgs.", pbkCount, pbk.getElementsByClass("pg").size()));
        Element hotword = pg.getElementById("hotword");

        System.out.println("Adding hotword: " + hotword.text());
        hotwords.add(hotword.text());
    }
}

运行该代码会产生以下输出:

Starting to crawl...
Found 3 pbks.

我要么没有正确使用 JSoup API,要么没有使用正确的选择器,或者两者兼而有之。关于我要去哪里出错的任何想法?提前致谢!

4

2 回答 2

2

如果你正在使用,getElementsByClass那么你不需要.在它之前添加,只需使用类名getElementsByClass("pg"),而不是getElementsByClass(".pg")

也一样getElementById。不要在价值#之前添加id。只需使用getElementById("hotword").

div此外,您的 s with class似乎pbk是嵌套的,因此getElementsByClass可能会给您重复的结果。


在知道您要解析的页面后,您可以使用一个选择器来完成。试试这种方式

for (Element element:doc.select("div.body div.pbk span.pg")){
    System.out.println(element.text());
}
于 2013-11-12T20:35:37.900 回答
0
Elements hotwords = document.select("#hotwords");

for (Element hotword : hotwords){
    String word = hotword.getText();
}
于 2013-11-12T20:32:49.673 回答