2015-04-18 7 views
1

Мне бы хотелось разобрать метаданные на книгу. Whild, пытающийся получить название Booktitle, я заметил, что не могу получить доступ к ChildNodes из элемента, содержащего TextNode. Вот мои данные:Jsoup возвращает неверный ChildNode

<div id="detail_content_wrapper"> 

       <h1> 
        MyBookTitle 22<br> 

        <span class="sub"> 

         subtext 
                Book 22 
         by <a href="/buch-autor/foo-bar">Foo Bar</a> 
        </span> 

       </h1> 

Я извлечь элементы в "detail_content_wrapper" с помощью:

Document parsedObject = Jsoup.parse(source); 
Element bookNotes = parsedObject.getElementById("detail_content_wrapper"); 
Element h1Element = bookNotes.getElementsByTag("h1").first() 

Это даст мне полное содержание внутри h1-Tag.

Когда я смотрю на дочерние узлы h1-element, первый Childnode является TextNode, который содержит BookName. НО когда я пытаюсь получить содержание первого ребенка ...

Element bookName = h1Element.children().first(); 

ИЛИ Element bookName = h1Element.childNode(0);

... Это, в обоих случаях, содержат 2-го узла, который является уш-Element.

Является ли это ошибкой или я использую Jsoup неправильно?

+1

возможно дубликат [Как получить этот текст с помощью Jsoup?] (Http://stackoverflow.com/questions/9417295/how-do-i-get-this-text-using-jsoup) – jmort253

+1

Спасибо друг. Я исправил это с помощью метода ownText(). Но мы не должны закрывать этот поток, пока поведение метода childNode не станет ясным. Невозможно получить доступ к ChildNode, содержащему TextNode, как я вижу. – Goot

+0

Можете ли вы уточнить свой вопрос, чтобы выделить эту часть и прояснить части, которые не являются дуплексом. Это поможет предотвратить его закрытие как таковое. Надеюсь это поможет. – jmort253

ответ

1

Название книги - TextNode, и вы должны перебирать узлы, а не элементы. Вот мой пример кода, который извлекает название книги из вашего тестового содержимого html.

package sample; 

import java.io.File; 
import java.nio.file.Files; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.nodes.Node; 
import org.jsoup.nodes.TextNode; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     String html = new String(Files.readAllBytes(new File("sample.html").toPath())); 

     Document parsedObject = Jsoup.parse(html); 
     Element bookNotes = parsedObject.getElementById("detail_content_wrapper"); 
     Element h1Element = bookNotes.getElementsByTag("h1").first(); 

     String bookTitle = null; 
     for (Node node : h1Element.childNodes()) { 
      if (node instanceof TextNode) { 
       bookTitle = ((TextNode) node).getWholeText(); 
       break; 
      } 
     } 

     System.out.println(bookTitle); 
    } 
} 
+0

почему это было бы лучшим решением, чем 'String bookTitle = bookNameNode.getElementsByTag (" h1 "). First(). OwnText();'? – Goot

+0

Да, вы правы, ваше решение также верное. Есть незначительная разница с моей. Ваше решение игнорирует пробелы, но это не важно для вашего дела. – ozhan

+0

Также я стараюсь избегать использования instanceof, если это возможно, поэтому я не могу принять ваш ответ в данный момент. – Goot

Смежные вопросы