Помогите разобрать URL-адреса mp3-файлов из html с помощью jsoup - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть асинхронный метод заполнения полей класса pojo с проанализированными данными через jsoup.Я пытаюсь проанализировать URL-адреса mp3-файлов для отдельных глав книги с этой страницы через foreach, но все запросы, которые я пробовал, не сработали.

http://www.loyalbooks.com/book/adventures-of-huckleberry-finn-by-mark-twain

Один элемент выглядит следующим образом в коде страницы, и идентификатор меняется из главы в главу

<div class="jp-free-media" style="font-size:xx-small;">(<a id="jp_playlist_1_item_0_mp3" href="http://www.archive.org/download/huckleberry_mfs_librivox/huckleberry_finn_01_twain_64kb.mp3" tabindex="1">download</a>)</div>

Мой AsyncTask, поиск URL-адресов mp3для в mLines2:

public class FillBook extends AsyncTask<Void, Void, SingleBook> {

private String link;
private String imgLink;
private String title;
ArrayList<String> tmpChapters = new ArrayList<>();
private SingleBook book;

public FillBook(String link, String imgLink, String title) {

    this.link = link;
    this.imgLink = imgLink;
    this.title = title;
}

@Override
protected SingleBook doInBackground(Void... params) {

    Document doc = null;
    book = new SingleBook(imgLink, title, false, false, null, new ArrayList<String>());


    Elements mLines;
    Elements mLines2;

    try {
         doc = Jsoup.connect(link).get();

    } catch (IOException | RuntimeException e) {
        e.printStackTrace();
    }
    if (doc != null) {


        mLines = doc.getElementsByClass("book-description");


        for (Element mLine : mLines) {
            String description= mLine.text();
            book.setDescription(description);

        }

        mLines2 = doc.select(".jp-free-media");
        for (Element mLine2 : mLines2) {
            tmpChapters.add(mLine2.attr("href"));
        }
    }else
        System.out.println("ERROR");

    book.setChapters(tmpChapters);
    return book;

}

protected void onPostExecute(SingleBook book) {

    super.onPostExecute(book);

            Toast.makeText(BookActivity.this, book.getChapters().get(0), Toast.LENGTH_LONG).show();
            Picasso.get().load(book.getImgUrl()).into(bookCover);
            nameAndAuthor.setText(book.getTitleAndAuthor());
            bookDescription.setText(book.getDescription());

И я получаю пустой ArrayList.Как получить http://www.archive.org/download/huckleberry_mfs_librivox/huckleberry_finn_01_twain_64kb.mp3 String, учитывая, что следующая глава будет id = "jp_playlist_1_item_1_mp3"?

1 Ответ

0 голосов
/ 21 декабря 2018

Tiarait от русского Stackoverflow помогло найти решение.Дело в том, что вышеупомянутый элемент создан js.Мне нужно было получить тело документа, а затем получить следующий массив через разбиения.

var audioPlaylist = new Playlist ("1", [{name: "Chapter 01", free: true, mp3: "http://www.archive.org/download/huckleberry_mfs_librivox/huckleberry_finn_01_twain_64kb.mp3"}, {name: "Chapter 02", free: true, mp3: "http://www.archive.org/download/huckleberry_mfs_librivox/huckleberry_finn_02_twain_64kb.mp3"}, ...

Метод doInBackground должен измениться на:

@Override
protected SingleBook doInBackground(Void... params) {

Document doc = null;
book = new SingleBook(imgLink, title, false, false, null, new ArrayList<String>());


Elements mLines;

try {
    doc = Jsoup.connect(link).get();

} catch (IOException | RuntimeException e) {
    e.printStackTrace();
}
if (doc != null) {


    mLines = doc.getElementsByClass("book-description");


    for (Element mLine : mLines) {
        String description= mLine.text();
        book.setDescription(description);

    }


    String arr = "";
    String html = doc.body().html();
    if (html.contains("var audioPlaylist = new Playlist(\"1\", ["))
        arr = html.split("var audioPlaylist = new Playlist\\(\"1\", \\[")[1];
    if (arr.contains("]"))
        arr = arr.split("\\]")[0];
    //-----------------------------------------
    if (arr.contains("},{")) {
        for (String mLine2 : arr.split("\\},\\{")) {
            if (mLine2.contains("mp3:\""))
                tmpChapters.add(mLine2.split("mp3:\"")[1].split("\"")[0]);
        }
    } else if (arr.contains("mp3:\""))
        tmpChapters.add(arr.split("mp3:\"")[1].split("\"")[0]);
}else
    System.out.println("ERROR");

book.setChapters(tmpChapters);
return book;

}

...