Hapus tag HTML dari String

422

Apakah ada cara yang baik untuk menghapus HTML dari string Java? Seperti regex sederhana

 replaceAll("\\<.*?>","") 

akan berfungsi, tetapi hal-hal seperti &amp;tidak akan dikonversi dengan benar dan non-HTML antara dua sudut kurung akan dihapus (yaitu .*?di dalam regex akan hilang).

Tukang batu
sumber
2
gunakan ini dengan panduan berikut: kompilasi 'org.jsoup: jsoup: 1.9.2'
VahidHoseini

Jawaban:

572

Gunakan parser HTML alih-alih regex. Ini benar-benar sederhana dengan Jsoup .

public static String html2text(String html) {
    return Jsoup.parse(html).text();
}

Jsoup juga mendukung penghapusan tag HTML terhadap daftar putih yang dapat disesuaikan, yang sangat berguna jika Anda hanya ingin mengizinkan mis. <b>, <i>Dan <u>.

Lihat juga:

BalusC
sumber
18
Jsoup itu bagus, tapi saya mengalami beberapa kekurangan dengannya. Saya menggunakannya untuk menghilangkan XSS, jadi pada dasarnya saya mengharapkan input teks biasa, tetapi beberapa orang jahat bisa mencoba mengirimi saya beberapa HTML. Dengan menggunakan Jsoup, saya dapat menghapus semua HTML tetapi, sayangnya itu juga menyusutkan banyak ruang menjadi satu dan menghapus jeda tautan (\ n karakter)
Ridcully
7
@Ridcully: untuk itu Anda ingin menggunakannya Jsoup#clean()sebagai gantinya.
BalusC
3
menggunakan clean () masih akan menyebabkan spasi tambahan dan \ n karakter dihapus. mis: Jsoup.clean ("a \ n b", Whitelist.none ()) mengembalikan "a b"
Keith
20
@Zeroows: ini gagal total <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Sekali lagi, HTML bukan bahasa biasa . Ini benar-benar di luar saya mengapa semua orang terus mencoba untuk melemparkan regex di atasnya untuk menguraikan bagian-bagian yang menarik daripada menggunakan parser nyata.
BalusC
4
gunakan Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));untuk melestarikan linebreak
Marc Johnen
275

Jika Anda menulis untuk Android, Anda dapat melakukan ini ...

android.text.Html.fromHtml(instruction).toString()
Ken Goodridge
sumber
12
Tip yang luar biasa. :) Jika Anda menampilkan teks dalam TextView, Anda dapat menghapus .toString () untuk mempertahankan beberapa pemformatan juga.
Lorne Laliberte
1
@Branky Tidak saya sudah mencoba ... jawaban yang diterima bekerja seperti pesona
Maverick
Bagus sekali. Semua tag html telah dihapus dari String.
user3144836
1
Ini bagus, tetapi tag <img> diganti dengan beberapa hal aneh. Saya mendapat kotak kecil di mana ada gambar
Bibaswann Bandyopadhyay
1
@BibaswannBandyopadhyay jawaban lain membantu menyingkirkan karakter ini
Vince
84

Jika pengguna masuk <b>hey!</b>, apakah Anda ingin menampilkan <b>hey!</b>atau hey!? Jika yang pertama, lepas lebih sedikit daripada yang lain, dan ampersand html-encode (dan kutip opsional) dan Anda baik-baik saja. Modifikasi kode Anda untuk menerapkan opsi kedua adalah:

replaceAll("\\<[^>]*>","")

tetapi Anda akan mengalami masalah jika pengguna memasukkan sesuatu yang salah bentuk <bhey!</b>.

Anda juga dapat melihat JTidy yang akan menguraikan input html "kotor", dan akan memberi Anda cara untuk menghapus tag, menjaga teks.

Masalah dengan mencoba menghapus html adalah browser memiliki parser yang sangat lunak, lebih lunak daripada perpustakaan mana pun yang dapat Anda temukan, jadi meskipun Anda melakukan yang terbaik untuk menghapus semua tag (menggunakan metode ganti di atas, pustaka DOM, atau JTidy) , Anda masih perlu memastikan untuk menyandikan karakter khusus HTML yang tersisa untuk menjaga keamanan output Anda.

Chris Marasti-Georg
sumber
1
Anda juga mengalami masalah, jika ada tanda <atau> yang tidak terhapus di dalam konten simpul html. <span> Umur saya <banyak teks> lalu umur Anda </span>. Saya pikir hanya 100% cara untuk melakukan ini adalah melalui beberapa antarmuka XML DOM (seperti SAX atau yang serupa), untuk menggunakan node.getText ().
Mitja Gustin
29

Cara lain adalah dengan menggunakan javax.swing.text.html.HTMLEditorKit untuk mengekstraksi teks.

import java.io.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class Html2Text extends HTMLEditorKit.ParserCallback {
    StringBuffer s;

    public Html2Text() {
    }

    public void parse(Reader in) throws IOException {
        s = new StringBuffer();
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleText(char[] text, int pos) {
        s.append(text);
    }

    public String getText() {
        return s.toString();
    }

    public static void main(String[] args) {
        try {
            // the HTML to convert
            FileReader in = new FileReader("java-new.html");
            Html2Text parser = new Html2Text();
            parser.parse(in);
            in.close();
            System.out.println(parser.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ref: Hapus tag HTML dari file untuk mengekstrak hanya TEKS

RealHowTo
sumber
5
Hasil dari "a <b atau b> c" adalah "ab atau b> c", yang tampaknya disayangkan.
dfrankow
1
Ini yang terbaik bagi saya. Saya perlu melestarikan jeda baris. Saya lakukan dengan menambahkan metode sederhana ini ke parser: @Override public void handleStartTag (HTML.Tag t, MutableAttributeSet a, int pos) {if (t == HTML.Tag.P || t == HTML.Tag.BR) {s.append ('\ n'); }}
MiguelMunoz
1
dfrankow: Ekspresi matematika a <b atau b> c harus ditulis dalam html seperti ini: a & lt; b atau b & gt; c
MiguelMunoz
24

Saya pikir cara termudah untuk memfilter tag html adalah:

private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>");

public static String removeTags(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }

    Matcher m = REMOVE_TAGS.matcher(string);
    return m.replaceAll("");
}
Serge
sumber
18

Juga sangat sederhana menggunakan Jericho , dan Anda dapat mempertahankan beberapa pemformatan (penghentian baris dan tautan, misalnya).

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());
Josh
sumber
4
Jericho dapat mengurai Situs ke jeda baris. Jsoup dan HTMLEditorKit tidak bisa melakukan itu.
homaxto
Jericho sangat mampu melakukan pekerjaan ini, banyak menggunakannya di proyek-proyek yang dimiliki.
Jerry Tian
3
Jericho bekerja seperti pesona. Terima kasih untuk sarannya. Satu catatan: Anda tidak harus membuat Segmen dari seluruh string. Sumber memperluas Segmen, sehingga berfungsi di konstruktor Renderer.
MrPlow
Jerico sekarang tampaknya sedikit tanggal (rilis terakhir adalah 3,4 pada akhir 2015). Namun, jika masih berfungsi dengan baik, maka masih berfungsi dengan baik!
Jonathan Hult
17

Jawaban yang diterima dari melakukan hanya Jsoup.parse(html).text()memiliki 2 masalah potensial (dengan JSoup 1.7.3):

  • Ini menghapus jeda baris dari teks
  • Ini mengubah teks &lt;script&gt;menjadi<script>

Jika Anda menggunakan ini untuk melindungi terhadap XSS, ini agak menjengkelkan. Ini adalah kesempatan terbaik saya untuk solusi yang ditingkatkan, menggunakan JSoup dan Apache StringEscapeUtils:

// breaks multi-level of escaping, preventing &amp;lt;script&amp;gt; to be rendered as <script>
String replace = input.replace("&amp;", "");
// decode any encoded html, preventing &lt;script&gt; to be rendered as <script>
String html = StringEscapeUtils.unescapeHtml(replace);
// remove all html tags, but maintain line breaks
String clean = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
// decode html again to convert character entities back into text
return StringEscapeUtils.unescapeHtml(clean);

Perhatikan bahwa langkah terakhir adalah karena saya perlu menggunakan output sebagai teks biasa. Jika Anda hanya membutuhkan output HTML maka Anda harus dapat menghapusnya.

Dan di sini ada banyak kasus uji (input ke output):

{"regular string", "regular string"},
{"<a href=\"link\">A link</a>", "A link"},
{"<script src=\"http://evil.url.com\"/>", ""},
{"&lt;script&gt;", ""},
{"&amp;lt;script&amp;gt;", "lt;scriptgt;"}, // best effort
{"\" ' > < \n \\ é å à ü and & preserved", "\" ' > < \n \\ é å à ü and & preserved"}

Jika Anda menemukan cara untuk membuatnya lebih baik, beri tahu saya.

Damien
sumber
2
Ini akan gagal terhadap sesuatu seperti &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. Sama berlaku untuk &#x26;. JSoup tidak mengonversi &lt;script&gt; into <script>, ia melakukan itu karena Anda menelepon StringEscapeUtils.unescapeHtmlsetelah JSoup membersihkan input.
Guillaume Polet
15

Di Android, coba ini:

String result = Html.fromHtml(html).toString();
Ameen Maheen
sumber
Ini berhasil! itu menghapus semua inline html dari teks :)
DritanX
1
Anda selalu menggunakan cuplikan kode untuk kode normal. Cuplikan Kode hanya seharusnya digunakan untuk HTML atau javascript atau kode lain yang dapat dijalankan di browser. Anda tidak dapat menjalankan Java di browser. Gunakan blok kode normal di masa depan ... Saya akan mengedit jawaban Anda untuk Anda saat ini dan memperbaiki format dll, tapi tolong jangan lakukan ini lagi di masa depan. Ini bukan pertama kalinya saya katakan tentang ini ...
Xaver Kapeller
1
@PaulCroarkin ini adalah perpustakaan di dalam SDK Android. android.text.Html
Ameen Maheen
1
Luar biasa. Menghapus semua tag html.
user3144836
2
terlihat akrab, seperti jawaban saya dari 2011.
Ken Goodridge
11

Escaping HTML benar-benar sulit untuk dilakukan dengan benar - saya pasti akan menyarankan menggunakan kode perpustakaan untuk melakukan ini, karena jauh lebih halus daripada yang Anda pikirkan. Lihatlah StringEscapeUtils dari Apache untuk pustaka yang cukup bagus untuk menangani ini di Java.

Tim Howland
sumber
Ini adalah hal yang saya cari tetapi saya ingin menghapus HTML alih-alih menghindarinya.
Mason
apakah Anda ingin menghapus html, atau Anda ingin mengubahnya menjadi teks biasa? Mengupas HTML dari string panjang dengan tag br dan entitas HTML dapat menyebabkan kekacauan yang tidak terbaca.
Tim Howland
4
StringEscapeUtils.unescapeHtml tidak menghapus html
Erin Drummond
5
Informasi yang baik tentang utils digunakan untuk menghapus tetapi tidak menjawab pertanyaan.
Alex
3
Jawaban yang membingungkan. Menghapus! = Menghilang
Lluis Martinez
7

Ini seharusnya bekerja -

Gunakan ini

  text.replaceAll('<.*?>' , " ") -> This will replace all the html tags with a space.

dan ini

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.
Sandeep1699
sumber
1
Secara umum, jawaban jauh lebih berguna jika mereka menyertakan penjelasan tentang apa yang dimaksudkan oleh kode.
Peter
6

Anda mungkin ingin mengganti <br/>dan memberi </p>tag dengan baris baru sebelum menghapus HTML untuk mencegahnya menjadi kekacauan yang tidak terbaca seperti yang disarankan Tim.

Satu-satunya cara saya bisa memikirkan menghapus tag HTML tetapi meninggalkan non-HTML antara kurung sudut akan diperiksa terhadap daftar tag HTML . Sesuatu di sepanjang garis ini ...

replaceAll("\\<[\s]*tag[^>]*>","")

Kemudian HTML-decode karakter khusus seperti &amp;. Hasilnya tidak boleh dianggap sanitasi.

licik
sumber
5

Atau, Anda dapat menggunakan HtmlCleaner :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}
Stephan
sumber
2
HtmlCleaner bekerja dengan baik, menjaga jeda baris dan memiliki rilis baru-baru ini (2.21 pada Mei 2017).
Jonathan Hult
4

Jawaban yang diterima tidak bekerja untuk saya untuk kasus uji yang saya sebutkan: hasil "a <b atau b> c" adalah "ab atau b> c".

Jadi, saya menggunakan TagSoup sebagai gantinya. Ini foto yang berhasil untuk test case saya (dan beberapa lainnya):

import java.io.IOException;
import java.io.StringReader;
import java.util.logging.Logger;

import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * Take HTML and give back the text part while dropping the HTML tags.
 *
 * There is some risk that using TagSoup means we'll permute non-HTML text.
 * However, it seems to work the best so far in test cases.
 *
 * @author dan
 * @see <a href="http://home.ccil.org/~cowan/XML/tagsoup/">TagSoup</a> 
 */
public class Html2Text2 implements ContentHandler {
private StringBuffer sb;

public Html2Text2() {
}

public void parse(String str) throws IOException, SAXException {
    XMLReader reader = new Parser();
    reader.setContentHandler(this);
    sb = new StringBuffer();
    reader.parse(new InputSource(new StringReader(str)));
}

public String getText() {
    return sb.toString();
}

@Override
public void characters(char[] ch, int start, int length)
    throws SAXException {
    for (int idx = 0; idx < length; idx++) {
    sb.append(ch[idx+start]);
    }
}

@Override
public void ignorableWhitespace(char[] ch, int start, int length)
    throws SAXException {
    sb.append(ch);
}

// The methods below do not contribute to the text
@Override
public void endDocument() throws SAXException {
}

@Override
public void endElement(String uri, String localName, String qName)
    throws SAXException {
}

@Override
public void endPrefixMapping(String prefix) throws SAXException {
}


@Override
public void processingInstruction(String target, String data)
    throws SAXException {
}

@Override
public void setDocumentLocator(Locator locator) {
}

@Override
public void skippedEntity(String name) throws SAXException {
}

@Override
public void startDocument() throws SAXException {
}

@Override
public void startElement(String uri, String localName, String qName,
    Attributes atts) throws SAXException {
}

@Override
public void startPrefixMapping(String prefix, String uri)
    throws SAXException {
}
}
makan siang
sumber
4

Saya tahu ini sudah lama, tetapi saya baru saja mengerjakan proyek yang mengharuskan saya untuk memfilter HTML dan ini berfungsi dengan baik:

noHTMLString.replaceAll("\\&.*?\\;", "");

alih-alih ini:

html = html.replaceAll("&nbsp;","");
html = html.replaceAll("&amp;"."");
rqualis
sumber
4

Berikut pembaruan yang sedikit lebih sempurna untuk mencoba menangani beberapa pemformatan untuk jeda dan daftar. Saya menggunakan output Amaya sebagai panduan.

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Stack;
import java.util.logging.Logger;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

public class HTML2Text extends HTMLEditorKit.ParserCallback {
    private static final Logger log = Logger
            .getLogger(Logger.GLOBAL_LOGGER_NAME);

    private StringBuffer stringBuffer;

    private Stack<IndexType> indentStack;

    public static class IndexType {
        public String type;
        public int counter; // used for ordered lists

        public IndexType(String type) {
            this.type = type;
            counter = 0;
        }
    }

    public HTML2Text() {
        stringBuffer = new StringBuffer();
        indentStack = new Stack<IndexType>();
    }

    public static String convert(String html) {
        HTML2Text parser = new HTML2Text();
        Reader in = new StringReader(html);
        try {
            // the HTML to convert
            parser.parse(in);
        } catch (Exception e) {
            log.severe(e.getMessage());
        } finally {
            try {
                in.close();
            } catch (IOException ioe) {
                // this should never happen
            }
        }
        return parser.getText();
    }

    public void parse(Reader in) throws IOException {
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("StartTag:" + t.toString());
        if (t.toString().equals("p")) {
            if (stringBuffer.length() > 0
                    && !stringBuffer.substring(stringBuffer.length() - 1)
                            .equals("\n")) {
                newLine();
            }
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.push(new IndexType("ol"));
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.push(new IndexType("ul"));
            newLine();
        } else if (t.toString().equals("li")) {
            IndexType parent = indentStack.peek();
            if (parent.type.equals("ol")) {
                String numberString = "" + (++parent.counter) + ".";
                stringBuffer.append(numberString);
                for (int i = 0; i < (4 - numberString.length()); i++) {
                    stringBuffer.append(" ");
                }
            } else {
                stringBuffer.append("*   ");
            }
            indentStack.push(new IndexType("li"));
        } else if (t.toString().equals("dl")) {
            newLine();
        } else if (t.toString().equals("dt")) {
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.push(new IndexType("dd"));
            newLine();
        }
    }

    private void newLine() {
        stringBuffer.append("\n");
        for (int i = 0; i < indentStack.size(); i++) {
            stringBuffer.append("    ");
        }
    }

    public void handleEndTag(HTML.Tag t, int pos) {
        log.info("EndTag:" + t.toString());
        if (t.toString().equals("p")) {
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("li")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.pop();
            ;
        }
    }

    public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("SimpleTag:" + t.toString());
        if (t.toString().equals("br")) {
            newLine();
        }
    }

    public void handleText(char[] text, int pos) {
        log.info("Text:" + new String(text));
        stringBuffer.append(text);
    }

    public String getText() {
        return stringBuffer.toString();
    }

    public static void main(String args[]) {
        String html = "<html><body><p>paragraph at start</p>hello<br />What is happening?<p>this is a<br />mutiline paragraph</p><ol>  <li>This</li>  <li>is</li>  <li>an</li>  <li>ordered</li>  <li>list    <p>with</p>    <ul>      <li>another</li>      <li>list        <dl>          <dt>This</dt>          <dt>is</dt>            <dd>sdasd</dd>            <dd>sdasda</dd>            <dd>asda              <p>aasdas</p>            </dd>            <dd>sdada</dd>          <dt>fsdfsdfsd</dt>        </dl>        <dl>          <dt>vbcvcvbcvb</dt>          <dt>cvbcvbc</dt>            <dd>vbcbcvbcvb</dd>          <dt>cvbcv</dt>          <dt></dt>        </dl>        <dl>          <dt></dt>        </dl></li>      <li>cool</li>    </ul>    <p>stuff</p>  </li>  <li>cool</li></ol><p></p></body></html>";
        System.out.println(convert(html));
    }
}
Mike
sumber
4

Menggunakan Html.fromHtml

Tag HTML adalah

<a href=”…”> <b>,  <big>, <blockquote>, <br>, <cite>, <dfn>
<div align=”…”>,  <em>, <font size=”…” color=”…” face=”…”>
<h1>,  <h2>, <h3>, <h4>,  <h5>, <h6>
<i>, <p>, <small>
<strike>,  <strong>, <sub>, <sup>, <tt>, <u>

Sesuai Dokumentasi resmi Android, tag apa pun dalam HTML akan ditampilkan sebagai String pengganti generik yang kemudian dapat dilalui oleh program Anda dan diganti dengan string nyata .

Html.formHtml metode mengambil Html.TagHandler dan Html.ImageGetter sebagai argumen serta teks untuk diuraikan.

Contoh

String Str_Html=" <p>This is about me text that the user can put into their profile</p> ";

Kemudian

Your_TextView_Obj.setText(Html.fromHtml(Str_Html).toString());

Keluaran

Ini tentang saya teks yang dapat dimasukkan pengguna ke profil mereka

IntelliJ Amiya
sumber
1
Tidak ada utilitas tambahan dan selaras dengan Android Docs. +1
davidbates
4

Berikut adalah satu lagi varian cara mengganti semua (Tag HTML | Entitas HTML | Ruang Kosong dalam konten HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); di mana konten adalah sebuah String.

silentsudo
sumber
1
Saya sedikit memperbaikinya: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { kode} Karena seringkali tag-tag itu berada tepat di sebelah teks. Dan setelah menghapus tag, ubah semua 2 dan lebih spasi menulis menjadi hanya 1.
Ondřej Stašek
4

Anda cukup menggunakan filter HTML default Android

    public String htmlToStringFilter(String textToFilter){

    return Html.fromHtml(textToFilter).toString();

    }

Metode di atas akan mengembalikan string yang difilter HTML untuk input Anda.

Anuraganu Punalur
sumber
3

Satu cara lagi adalah dengan menggunakan kelas com.google.gdata.util.common.html.HtmlToText seperti

MyWriter.toConsole(HtmlToText.htmlToPlainText(htmlResponse));

Ini bukan kode bukti peluru dan ketika saya menjalankannya pada entri wikipedia saya mendapatkan info gaya juga. Namun saya percaya untuk pekerjaan kecil / sederhana ini akan efektif.

rjha94
sumber
3

Sepertinya Anda ingin beralih dari HTML ke teks biasa.
Jika demikian, lihat www.htmlparser.org. Berikut adalah contoh yang menghapus semua tag dari file html yang ditemukan di URL.
Itu memanfaatkan org.htmlparser.beans.StringBean .

static public String getUrlContentsAsText(String url) {
    String content = "";
    StringBean stringBean = new StringBean();
    stringBean.setURL(url);
    content = stringBean.getStrings();
    return content;
}
CSchulz
sumber
2

Berikut cara lain untuk melakukannya:

public static String removeHTML(String input) {
    int i = 0;
    String[] str = input.split("");

    String s = "";
    boolean inTag = false;

    for (i = input.indexOf("<"); i < input.indexOf(">"); i++) {
        inTag = true;
    }
    if (!inTag) {
        for (i = 0; i < str.length; i++) {
            s = s + str[i];
        }
    }
    return s;
}
bintang hitam
sumber
Atau Anda bisa mengatakan, jika (input.indexOf ("<")> 0 || input.indexOf (">")> 0) return ""; masukan lain kembali;
Hossein Shahdoost
2

Orang juga bisa menggunakan Apache Tika untuk tujuan ini. Secara default ia mempertahankan spasi putih dari html yang dilucuti, yang mungkin diinginkan dalam situasi tertentu:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())
Maksim Sorokin
sumber
1
Perhatikan bahwa metode parse sudah tidak digunakan lagi Parse.parse(InputStream, ContentHandler, Metadata, ParseContext).
Jacob van Lingen
1

Salah satu cara untuk mempertahankan informasi baris baru dengan JSoup adalah dengan mendahului semua tag baris baru dengan beberapa string dummy, jalankan JSoup dan ganti string dummy dengan "\ n".

String html = "<p>Line one</p><p>Line two</p>Line three<br/>etc.";
String NEW_LINE_MARK = "NEWLINESTART1234567890NEWLINEEND";
for (String tag: new String[]{"</p>","<br/>","</h1>","</h2>","</h3>","</h4>","</h5>","</h6>","</li>"}) {
    html = html.replace(tag, NEW_LINE_MARK+tag);
}

String text = Jsoup.parse(html).text();

text = text.replace(NEW_LINE_MARK + " ", "\n\n");
text = text.replace(NEW_LINE_MARK, "\n\n");
RobMen
sumber
1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 
Guilherme Oliveira
sumber
3
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda. Tolong juga cobalah untuk tidak membuat kerumunan kode Anda dengan komentar penjelasan, ini mengurangi keterbacaan kode dan penjelasan!
Filnor
0

5 sen saya:

String[] temp = yourString.split("&amp;");
String tmp = "";
if (temp.length > 1) {

    for (int i = 0; i < temp.length; i++) {
        tmp += temp[i] + "&";
    }
    yourString = tmp.substring(0, tmp.length() - 1);
}
Alexander
sumber
0

Untuk mendapatkan teks html biasa yang telah diformat, Anda dapat melakukannya:

String BR_ESCAPED = "&lt;br/&gt;";
Element el=Jsoup.parse(html).select("body");
el.select("br").append(BR_ESCAPED);
el.select("p").append(BR_ESCAPED+BR_ESCAPED);
el.select("h1").append(BR_ESCAPED+BR_ESCAPED);
el.select("h2").append(BR_ESCAPED+BR_ESCAPED);
el.select("h3").append(BR_ESCAPED+BR_ESCAPED);
el.select("h4").append(BR_ESCAPED+BR_ESCAPED);
el.select("h5").append(BR_ESCAPED+BR_ESCAPED);
String nodeValue=el.text();
nodeValue=nodeValue.replaceAll(BR_ESCAPED, "<br/>");
nodeValue=nodeValue.replaceAll("(\\s*<br[^>]*>){3,}", "<br/><br/>");

Untuk mendapatkan perubahan teks biasa yang diformat <br/> oleh \ n dan ubah baris terakhir dengan:

nodeValue=nodeValue.replaceAll("(\\s*\n){3,}", "<br/><br/>");
surfealokesea
sumber
0

Saya tahu ini sudah lama sejak pertanyaan ini diajukan, tetapi saya menemukan solusi lain, inilah yang bekerja untuk saya:

Pattern REMOVE_TAGS = Pattern.compile("<.+?>");
    Source source= new Source(htmlAsString);
 Matcher m = REMOVE_TAGS.matcher(sourceStep.getTextExtractor().toString());
                        String clearedHtml= m.replaceAll("");
Itay Sasson
sumber
-1

Anda cukup membuat metode dengan multiple replaceAll () seperti

String RemoveTag(String html){
   html = html.replaceAll("\\<.*?>","")
   html = html.replaceAll("&nbsp;","");
   html = html.replaceAll("&amp;"."");
   ----------
   ----------
   return html;
}

Gunakan tautan ini untuk penggantian paling umum yang Anda butuhkan: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html

Ini sederhana tetapi efektif. Saya menggunakan metode ini pertama untuk menghapus sampah tetapi bukan baris pertama yaitu replaceAll ("\ <. *?>", ""), Dan kemudian saya menggunakan kata kunci spesifik untuk mencari indeks dan kemudian menggunakan .substring (mulai, akhiri ) metode untuk menghapus hal-hal yang tidak perlu. Karena ini lebih kuat dan Anda dapat menunjukkan dengan tepat apa yang Anda butuhkan di seluruh halaman html.

Rizwan
sumber
4
Dua catatan. Pertama, ini adalah suboptimal - untuk setiap replaceAll panggilan, Java akan berusaha untuk mengkompilasi argumen pertama sebagai regex dan menjalankan seluruh string untuk menerapkan regex itu ke string, memproses beberapa lusin KB untuk halaman HTML biasa setiap waktu. Kedua, disarankan untuk tidak menggunakan replaceAll untuk mengganti string sederhana (non-regex), tetapi gunakan replace () (yang juga menggantikan semua, tidak seperti namanya).
fwielstra
-1

Hapus tag HTML dari string. Di suatu tempat kita perlu mengurai beberapa string yang diterima oleh beberapa tanggapan seperti Httpresponse dari server.

Jadi kita perlu menguraikannya.

Di sini saya akan menunjukkan cara menghapus tag html dari string.

    // sample text with tags

    string str = "<html><head>sdfkashf sdf</head><body>sdfasdf</body></html>";



    // regex which match tags

    System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex("<[^>]*>");



    // replace all matches with empty strin

    str = rx.Replace(str, "");



    //now str contains string without html tags
Satya Prakash
sumber
Darimana Anda mendapatkan new System.Text.RegularExpressions.Regex();?
beresfordt
1
@beresfordt tanggapan ini berlaku untuk .NET, bukan Java seperti yang diminta dalam pertanyaan
Erin Drummond