Jsoup начать анализ ПОСЛЕ указанного тега или начать с нижней части страницы? - PullRequest
1 голос
/ 05 января 2012

У меня есть блок HTML, который я анализирую с помощью Jsoup, однако, не все из них актуальны, и анализ не относящихся к делу частей отбрасывает мой набор данных.

На сайте есть заголовок, который может измениться в любое время. В этом заголовке есть ссылки, но ссылки, которые меня не волнуют. Когда Jsoup анализирует документ, он добавляет эти мысли в мой массив ссылок и отбрасывает мои значения.

Интересующий меня HTML-код следует после <!-- BEGIN TOPICS --> тег.

Я бы хотел сказать Jsoup игнорировать все, что находится над этим тегом. Это возможно? Если нет, я могу обойти эту проблему, начав мой анализ в нижней части документа, но я не уверен, как бы я поступил об этом тоже.

Мой запрос Jsoup выглядит следующим образом. Пожалуйста, игнорируйте все закомментированные строки и операторы отладки, я пытался решить это некоторое время и до сих пор есть тестовый код.

       Thread getTitlesThread = new Thread() {
            public void run() {
                TitleResults titleArray =  new TitleResults();
                StringBuilder whole = new StringBuilder();

                try {
                    URL url = new URL(
                            Constants.FORUM);
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
                    try {
                        BufferedReader in = new BufferedReader(
                            new InputStreamReader(new BufferedInputStream(urlConnection.getInputStream())));
                        String inputLine;
                        while ((inputLine = in.readLine()) != null)
                            whole.append(inputLine);
                        in.close();
                    } catch (IOException e) {}
                    finally {
                        urlConnection.disconnect();
                    }
                } catch (Exception e) {}
                Document doc = Parser.parse(whole.toString(), Constants.FORUM);
                Elements threads = doc.select("TOPICS > .topic_title");
                Elements authors = doc.select("a[hovercard-ref]");
//              for (Element author : authors) {
//                  authorArray.add(author.text());
//              }
//              cleanAuthors();
                if (threads.isEmpty()) {
                    Log.d("POC", "EMPTY BRO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
                }
//              for (Element thread : threads) {
//                  titleArray =  new TitleResults();
//                  Log.d("POC", thread.toString());
//
//                  titleArray.setAuthorDate(authorArray.get(0));
//                  authorArray.remove(0);

                    //Thread title
//                  threadTitle = thread.text();
//                  titleArray.setItemName(threadTitle);
//                  
//                  //Thread link
//                  String threadStr = thread.attr("abs:href");
//                  String endTag = "/page__view__getnewpost"; //trim link
//                  threadStr = new String(threadStr.replace(endTag, ""));
//                  threadArray.add(threadStr);
//                  results.add(titleArray);
//              }
           } 
        };
        getTitlesThread.start();

Ответы [ 2 ]

1 голос
/ 05 января 2012

Это должно работать, учитывая ваше описание (трудно убедиться без фактического ввода HTML):

    Document document = ...;
    Elements elements = document.getAllElements();
    Element comment = null;
    int size = elements.size();
    for (int i = 0; comment == null && i < size; i++) {
        Element element = elements.get(i);
        for (Node node : element.childNodes()) {
            if (node instanceof Comment) {
                String str = ((Comment) node).getData().trim();
                if ("BEGIN TOPICS".equals(str)) {
                    comment = element;
                    break;
                }
            }
        }
    }

    // Did we find <-- BEGIN TOPICS -->?
    if (comment != null) {
        // You can now select from the siblingElements of comment
        // and only get stuff "after" that comment:
        // e.g. Elements e = comment.siblingElements().select("a");
    } else {
        // Oh snap.
    }
0 голосов
/ 11 января 2012

Удалите часть документа, с которой вы не хотите разбирать:

Document doc = Parser.parse(whole.toString().replaceAll("<!-- end ad tag -->?.*?<!-- BEGIN TOPICS -->", ""), Constants.FORUM);

Где <!-- end ad tag --> было началом того, что я хотел игнорировать, а <!-- BEGIN TOPICS --> было концом.

...