【问题标题】:get next element that have same name class jsoup in android studio在android studio中获取下一个具有相同名称类jsoup的元素
【发布时间】:2016-02-14 23:17:34
【问题描述】:

我想在 html 中获取下一个具有相同名称类的元素。 html标签就像:

html:

  <section class="post">
        <img class="pecintakomik" src="/images/top/op.jpg" alt="pecintakomik.com" />
            <div class="post-cnt">
                <h2>Manga bla bla</h2>
                    <ul>
                    <li><strong>Nama Alternatif:</strong> </li>
                    <li><strong>Tahun Rilis:</strong> 2010</li>
                    <li><strong>Author(s):</strong> sensei1
                    <li><strong>Artist(s):</strong> sense2</li>
                    <li><strong>Genre:</strong> Action</li>
                    <li><strong>Sinopsis:</strong> bla bla bla </li>
                    <li><span class='st_facebook_hcount' displayText='Facebook'></span> <span class='st_twitter_hcount' displayText='Tweet'></span> <span class='st_sharethis_hcount' displayText='ShareThis'></span></li>                      
                    </ul>
            </div>
                <div class="clear">&nbsp;</div>
    </section>
    <img src="http://www.pecintakomik.com/images/block.png">
    <section class="post">
        <div class="post-cnt">
            <h2>List Chapter(s)</h2>
            <ul>
                <li><a href="/manga/bla_bla/816"> bla bl 816 <img src="/images/new.gif"><em>Baca Online </em></a></li>
                <li><a href="/manga/bla_bla/815"> bla bla 815<em>Baca Online </em></a></li>
                <li><a href="/manga/bla_bla/814"> bla bla 814<em>Baca Online </em></a></li>
                <li><a href="/manga/bla_bla/813"> bla bla 813<em>Baca Online </em></a></li>
            </ul>
       </div>
    </section>

我的代码是获取列表漫画的href链接(并将其存储在sqllite上),但我无法获取:

java代码:

private List<Chapter> parseHtmlToChapters(RequestWrapper request, String unparsedHtml) {
    int beginIndex = unparsedHtml.indexOf("<div class=\"post-cnt\">");
    int endIndex = unparsedHtml.indexOf("</div>", beginIndex);

    String trimmedHtml = unparsedHtml.substring(beginIndex, endIndex);

    Document parsedDocument = Jsoup.parse(trimmedHtml);


    List<Chapter> chapterList = scrapeChaptersFromParsedDocument(parsedDocument);
    chapterList = setSourceForChapterList(chapterList);
    chapterList = setParentUrlForChapterList(chapterList, request.getUrl());
    chapterList = setNumberForChapterList(chapterList);

    saveChaptersToDatabase(chapterList, request.getUrl());

    return chapterList;
}

private List<Chapter> scrapeChaptersFromParsedDocument(Document parsedDocument) {
    List<Chapter> chapterList = new ArrayList<Chapter>();

    Element chapterElementnya = parsedDocument.select("div.post-cnt").get(1);
    Elements chapterElements = chapterElementnya.getElementsByTag("li");


    for (Element chapterElement : chapterElements) {
        Chapter currentChapter = constructChapterFromHtmlBlock(chapterElement);

        chapterList.add(currentChapter);
    }

    return chapterList;
}

private Chapter constructChapterFromHtmlBlock(Element chapterElement) {
    Chapter newChapter = DefaultFactory.Chapter.constructDefault();

    Element urlElement = chapterElement.select("a").first();
    Element nameElement = chapterElement.select("a").first();

    if (urlElement != null) {
        String fieldUrl = "http://www.pecintakomik.com" + urlElement.attr("href");
        newChapter.setUrl(fieldUrl);
    }
    if (nameElement != null) {
        String fieldName = nameElement.text();
        newChapter.setName(fieldName);
    }

    boolean fieldNew = chapterElement.html().contains("<img src=\"/images/new.gif\">");
    newChapter.setNew(fieldNew);

    return newChapter;
}

请问有谁知道如何获取同名的二等舱名单?

【问题讨论】:

    标签: java android html jsoup


    【解决方案1】:

    这段代码:

    private List<Chapter> parseHtmlToChapters(RequestWrapper request, String unparsedHtml) {
        int beginIndex = unparsedHtml.indexOf("<div class=\"post-cnt\">");
        int endIndex = unparsedHtml.indexOf("</div>", beginIndex);
    
        String trimmedHtml = unparsedHtml.substring(beginIndex, endIndex);
        ...
    }
    

    只保留第一个列表。 trimmedHtml 将包含以下内容:

    <div class="post-cnt">
        <h2>Manga bla bla</h2>
        <ul>
            <li><strong>Nama Alternatif:</strong> </li>
            <li><strong>Tahun Rilis:</strong> 2010</li>
            <li><strong>Author(s):</strong> sensei1
            <li><strong>Artist(s):</strong> sense2</li>
            <li><strong>Genre:</strong> Action</li>
            <li><strong>Sinopsis:</strong> bla bla bla </li>
            <li><span class='st_facebook_hcount' displayText='Facebook'></span> <span class='st_twitter_hcount' displayText='Tweet'></span> <span class='st_sharethis_hcount' displayText='ShareThis'></span></li>                      
        </ul>
    </div>
    

    要保留这两个列表,您可以这样做:

    int beginIndex = unparsedHtml.indexOf("<div class=\"post-cnt\">");
    int secondListStart = unparsedHtml.indexOf("<div class=\"post-cnt\">",beginIndex + "<div class=\"post-cnt\">".length());
    int endIndex = unparsedHtml.indexOf("</div>", secondListStart) + "</div>".length();
    
    String trimmedHtml = unparsedHtml.substring(beginIndex, endIndex);
    

    但是解析整个页面会更安全。为此,请更改:

    Document parsedDocument = Jsoup.parse(trimmedHtml);
    

    收件人:

    Document parsedDocument = Jsoup.parse(unparsedHtml);
    

    【讨论】:

    • 我怎样才能获得第二个
      ?不是第一个
      。为什么解析整个页面更安全?
    • @poundPound 解析整个页面更安全,因为 HTML 语法不是那么严格,这意味着如果 HTML 代码包含额外的空格或使用 ' 而不是 " 作为引号,indexOf("&lt;div class=\"post-cnt\"&gt;") 将失败或者谁知道还有什么,Jsoup 处理所有这些。要仅获取第二个列表,您可以使用:String trimmedHtml = unparsedHtml.substring(secondListStart, endIndex);
    【解决方案2】:

    试试这个

    private List<Chapter> parseHtmlToChapters(RequestWrapper request, String unparsedHtml) {
    
        Document parsedDocument = Jsoup.parse(unparsedHtml);
    
        List<Chapter> chapterList = new ArrayList<>();
    
        for (Element a : parsedDocument.select("div.post-cnt a")) {
            Chapter newChapter = DefaultFactory.Chapter.constructDefault();
            newChapter.setUrl("http://www.pecintakomik.com" + a.attr("href"));
            newChapter.setName(a.text());
            newChapter.setNew(!a.select("img[src=/images/new.gif]").isEmpty());
            chapterList.add(newChapter);
        }
        // .....
    

    parsedDocument.select("div.post-cnt a") 选择所有&lt;div class="post-cnt"&gt; 元素下的所有&lt;a&gt; 元素。您的示例 HTML 中有四个这样的元素。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签