Замените некоторые атрибуты HTML Jsoup, не меняя остальную часть ввода - PullRequest
1 голос
/ 27 сентября 2019

Я работаю с входящими текстовыми блоками html, например:

String html = "<p>Some text here with already existing tags and it&#39;s escaped symbols.\n" +
                "    More text here:<br/>\\r\\n---<br/>\\r\\n" +
                "    <img src=\"/attachments/a0d4789a-1575-4b70-b57f-9e8fe21df46b\" sha256=\"2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c\"></a>" +
                "    It was img tag with attr to replace above</p>\\r\\n\\r\\n<p>More text here\n" +
                "    and here.<br/>\\r\\n---</p>";

Мне нужно заменить значение атрибута src в тегах img слегка измененным значением атрибута sha256 в том же теге.Я легко могу сделать это с помощью Jsoup:

        Document doc = Jsoup.parse(html);
        Elements elementsByAttribute = doc.select("img[src]");
        elementsByAttribute.forEach(x -> x.attr("src", "/usr/myfolder/" + x.attr("sha256") + ".zip"));

Но есть проблема.Входящий текст уже имеет некоторое форматирование, HTML-теги, экранирование и т. Д., Которые необходимо сохранить.Но Jsoup удаляет теги / добавляет теги / освобождает / экранирует и делает некоторые другие модификации исходного ввода.

Например, System.out.println(doc); или System.out.println(doc.html()); дает мне следующее:

<html>
 <head></head>
 <body>
  <p>Some text here with already existing tags and it's escaped symbols. More text here:<br>\r\n---<br>\r\n <img src="/usr/myfolder/2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c.zip" sha256="2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c"> It was img tag with attr to replace above</p>\r\n\r\n
  <p>More text here and here.<br>\r\n---</p>
 </body>
</html>

Мой атрибут src заменен, но добавлено намного больше html-тегов, it&#39;s экранируется до it's.

Если я использую System.out.println(doc.text());, я получаю следующее:

Some text here with already existing tags and it's escaped symbols. More text here: \r\n--- \r\n It was img tag with attr to replace above\r\n\r\n More text here and here. \r\n---

Мои теги здесь удалены, it&#39;s снова переведено в it's.

Я пробовал некоторые другие функции Jsoup, но не нашел, как решить эту проблему.

Quesion: есть ли способ заменить только некоторые атрибуты Jsoup без изменения других тегов?Может быть, есть какая-то другая библиотека для этой цели?Или мой единственный способ это регулярное выражение?

1 Ответ

0 голосов
/ 27 сентября 2019
import Torello.HTML.*;
import Torello.HTML.NodeSearch.TagNodeFind;
import Torello.HTML.Tools.ReplaceNodes;
import Torello.Java.FileRW;

import java.util.*;
import java.io.*;

public class Scrape
{
    static final String html =
        "<p>Some text here with already existing tags and it&#39;s escaped symbols.\n" +
        "    More text here:<br/>\\r\\n---<br/>\\r\\n" +
        "    <img src=\"/attachments/a0d4789a-1575-4b70-b57f-9e8fe21df46b\" sha256=\"2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c\"></a>" +
        "    It was img tag with attr to replace above</p>\\r\\n\\r\\n<p>More text here\n" +
        "    and here.<br/>\\r\\n---</p>";

    public static void main(String[] argv) throws IOException
    {
        Vector<HTMLNode>    page    = HTMLPage.getPageTokens(html, false);
        int[]               posArr  = TagNodeFind.all(page, TC.OpeningTags, "img");

        ReplaceNodes.r(page, posArr, (HTMLNode n, int curVecPos, int iterationCount) ->
            {
                TagNode imageNode = (TagNode) n;
                String src = "/usr/myfolder/" + imageNode.AV("sha256") + ".zip";
                return imageNode.setAV("src", src, SD.DoubleQuotes);
            }
        );

        System.out.println("Updated HTML:\n" + Util.pageToString(page));
    }
}

Следующий вывод будет отправлен на терминал:

Updated HTML:
<p>Some text here with already existing tags and it&#39;s escaped symbols.
    More text here:<br/>\r\n---<br/>\r\n    <img sha256="2957635fcf46eb54d99f4f335794bd75a89d2ebc1663f5d1708a2fc662ee065c" src="/usr/myfolder/2957635fcf46eb54d99f4f3357
94bd75a89d2ebc1663f5d1708a2fc662ee065c.zip"></a>    It was img tag with attr to replace above</p>\r\n\r\n<p>More text here
    and here.<br/>\r\n---</p>
...