Nano Hash - криптовалюты, майнинг, программирование

Jsoup анализирует html для нижнего и верхнего индекса

Я использую Jsoup для анализа значения буфера обмена в HTML-код, но это не работает для subscript и superscript. Например:

Верхний индекс
Привет, Мир (HTML: <b>Hello <sup>World</sup></b>)

Подстрочный индекс
Привет, Мир (HTML: <b>Hello <sub>World</sub></b>)

Код

result = rtfToHtml(new StringReader(streamToString((InputStream) contents.getTransferData(dfRTF))));

Результат для приведенного выше примера:

< html >
  < head >
    < style >
      < !--
        p.default {
          size:3;
          family:sansserif;
          foreground:#000000;
          bold:normal;
          italic:;
        }
      -- >
    < /style >
  < /head >
  < body >
    < p class=default >
      < span style="color: #000000; font-size: 14pt; font-family: ArialMT">
        < b>Hello < /b>
      < /span>
      < span style="color: #000000; font-size: 11pt; font-family: ArialMT">
        < b>World< /b>
      < /span>
    < /p>
  < /body>
< /html>

Любая идея, как я могу обрабатывать Superscript и Subscript с помощью Jsoup. Любые советы или ссылки высоко ценятся.

ИЗМЕНИТЬ

        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable contents = clipboard.getContents(null);
        DataFlavor dfRTF = new DataFlavor("text/rtf", "Rich Formatted Text");
        DataFlavor dfTxt = DataFlavor.stringFlavor;

        boolean hasTransferableRTFText = (contents != null)
                && contents.isDataFlavorSupported(dfRTF);
        boolean hasTransferableTxtText = (contents != null)
                && contents.isDataFlavorSupported(dfTxt);
if (hasTransferableRTFText) {
            try {
result = rtfToHtml(new StringReader(streamToString((InputStream) contents.getTransferData(dfRTF))));
Document doc = Jsoup.parse(result);
}
}

ИЗМЕНИТЬ

public static String rtfToHtml(Reader rtf) throws IOException { // From http://www.codeproject.com/Tips/136483/Java-How-to-convert-RTF-into-HTML
        JEditorPane p = new JEditorPane();
        p.setContentType("text/rtf");
        EditorKit kitRtf = p.getEditorKitForContentType("text/rtf");
        try {
            kitRtf.read(rtf, p.getDocument(), 0);
            kitRtf = null;
            EditorKit kitHtml = p.getEditorKitForContentType("text/html");
            Writer writer = new StringWriter();
            kitHtml.write(writer, p.getDocument(), 0, p.getDocument().getLength());
            return writer.toString();
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
        return null;
    }

  • Текущий вопрос не содержит достаточно подробностей. Что такое rtfToHtml? Jsoup конвертирует все как положено, но ваша проблема в функции rtfToHtml. Это это? 23.12.2013
  • @msangel отредактировал мой вопрос 23.12.2013

Ответы:


1

Ваша проблема связана не с JSoup, а с вашей функцией rtfToHtml.

Ваша функция не генерирует ожидаемые теги ‹sub› и ‹sup›. JSoup ничего не может сделать на этом шаге, потому что ожидаемых тегов здесь нет, поэтому вы не можете их проанализировать.

EDIT: (и решение)

Вы должны пропустить шаг rtfToHTML, если в этом нет необходимости. Если буфер обмена уже содержит данные в формате HTML, то запрашивать их в формате rtf, а затем конвертировать обратно в HTML означает потерю информации о формате во время конвертации.

Вы можете получить буфер обмена прямо в формате HTML, чтобы избежать ненужных преобразований:

DataFlavor dfHTML = new DataFlavor("text/html; charset=Unicode");
boolean hasTransferableHTMLText = (contents != null) && contents.isDataFlavorSupported(dfHTML);
if (hasTransferableHTMLText)
{
    InputStream is = (InputStream)contents.getTransferData(dfHTML);
    String htmldata = org.apache.commons.io.IOUtils.toString(is, "Unicode");  

    Document doc = Jsoup.parse(htmldata);
    System.out.println(doc.html());
    //...
}

Протестировано с копированием в буфер обмена из Chrome и FF. Оба сохраняют ожидаемые теги ‹sub› и ‹sup›.

EDIT2:

IOUtils относится к org.apache.commons.io.IOUtils

22.12.2013
  • На этот комментарий до сих пор нет ответа. Откуда взялась эта функция rtfToHtml? Просто нет тегов sup и sub. Это не проблема JSoup, а просто проблема с этим методом (или исходными данными, которые не содержат того, что вы ожидаете). Этот метод, кажется, генерирует индекс как style с меньшим размером текста. Нет возможности разобрать это семантически, только эвристически. 23.12.2013
  • String htmldata = IOUtils.toString(is, "Unicode"); выдает ошибку method toString in class Object cannot be applied to given types; required: no arguments found: InputStream,String reason: actual and formal argument lists differ in length 23.12.2013
  • IOUtils относится к библиотеке apache commons.io. Возможно, у вас уже есть объект IOUtils в вашем классе для другой цели. Чтобы избежать конфликта, назовите IOUtils явно: String htmldata = org.apache.commons.io.IOUtils.toString(is, "Unicode"); 23.12.2013

  • 2

    Используйте селектор Jsoup, чтобы получить желаемое значение. Эта ссылка поможет вам.

    Document doc = Jsoup.Connect("some url);
    Elements sub= doc.select("sub");
    
    20.12.2013
  • В проанализированном html нет элемента sub. Таким образом, Elements sub = doc.select("sub"); будет нулевым. 23.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..