Сохранение строк с помощью Jsoup - PullRequest
1 голос
/ 28 ноября 2011

Я использую Jsoup для получения некоторых данных из HTML, у меня есть этот код:

System.out.println("nie jest");
StringBuffer url=new StringBuffer("http://www.darklyrics.com/lyrics/");
url.append(args[0]);
url.append("/");
url.append(args[1]);
url.append(".html");

//wyciaganie odpowiednich klas z naszego htmla
Document doc=Jsoup.connect(url.toString()).get();
Element lyrics=doc.getElementsByClass("lyrics").first();
Element tracks=doc.getElementsByClass("albumlyrics").first();

//Jso
//lista sciezek
int numberOfTracks=tracks.getElementsByTag("a").size();

Все бы хорошо, я извлекаю данные, которые хочу, но когда я делаю:

lyrics.text()

Я получаю текст без разрывов строк, поэтому мне интересно, как оставить разрывы строк в отображаемом тексте, я читал другие темы по stackoverflow по этому вопросу, но они не помогли, я пытался сделать что-то вроде этого:

TextNode tex=TextNode.createFromEncoded(lyrics.text(), lyrics.baseUri());

но я не могу получить нужный текст с переносами строк. Я смотрел в предыдущих темах об этом, как, Удаление сущностей HTML с сохранением разрывов строк с помощью JSoup но я не могу получить желаемый эффект. Что мне делать?

Редактировать: Я получил эффект, который хотел, но не думаю, что это очень хорошее решение:

for (Node nn:listOfNodes)
            {
                String s=Jsoup.parse(nn.toString()).text();
                if ((nn.nodeName()=="#text" || nn.nodeName()=="h3"))
                {
                    buf.append(s+"\n");

                }
            }

Кто-нибудь получил идею получше?

1 Ответ

1 голос
/ 28 ноября 2011

Вы можете получить текстовые узлы (текст между <br /> s), проверив, является ли узел экземпляром TextNode. Это должно сработать для вас:

Document document = Jsoup.connect(url.toString()).get();
Element lyrics = document.select(".lyrics").first();
StringWriter buffer = new StringWriter();
PrintWriter writer = new PrintWriter(buffer);

for (Node node : lyrics.childNodes()) {
    if (node.nodeName().equals("h3")) {
        writer.println(((Element) node).text());
    } else if (node instanceof TextNode) {
        writer.println(((TextNode) node).text());
    }
}

System.out.println(buffer.toString());

(обратите внимание, что сравнение внутреннего значения объекта должно выполняться методом equals(), а не ==; строки - это объекты, а не примитивы)

О, я также предлагаю прочитать политику конфиденциальности .

...