Bir dizeden HTML etiketlerini kaldırma


422

Bir Java dizesinden HTML kaldırmanın iyi bir yolu var mı? Basit bir normal ifade

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

çalışacak, ancak &amp;doğru şekilde dönüştürülmeyecek ve iki açılı parantez arasındaki HTML olmayan öğeler kaldırılacak (yani .*?normal ifadede kaybolacak).


2
bunu aşağıdaki kılavuzla kullanın: compile 'org.jsoup: jsoup: 1.9.2'
VahidHoseini


Yanıtlar:


572

Normal ifade yerine bir HTML ayrıştırıcı kullanın. Jsoup için bu çok basit .

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

Jsoup da destekler sadece örn izin vermek istiyorsanız çok yararlıdır özelleştirilebilir beyaz listeye karşı HTML etiketlerini çıkarmadan <b>, <i>ve <u>.

Ayrıca bakınız:


18
Jsoup güzel, ama onunla bazı dezavantajları ile karşılaştı. XSS'den kurtulmak için kullanıyorum, bu yüzden temelde düz bir metin girişi bekliyorum, ancak bazı kötü insanlar bana biraz HTML göndermeyi deneyebilirler. Jsoup kullanarak tüm HTML'yi kaldırabilirim, ancak maalesef birçok alanı da küçültür ve bağlantı kopmalarını (\ n karakter) kaldırır
Ridcully

7
@Ridcully: Jsoup#clean()bunun yerine kullanmak istersiniz .
BalusC

3
clean () kullanılması hala fazladan boşlukların ve \ n karakterlerin kaldırılmasına neden olur. örnek: Jsoup.clean ("a \ n b", Whitelist.none ()) "a b" döndürür
Keith,

20
@Zeroows: bu sefil bir şekilde başarısız oluyor <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Yine, HTML normal bir dil değil . Herkesin neden gerçek bir ayrıştırıcı kullanmak yerine ilgi alanlarını ayrıştırmak için üzerine düzenli ifade atmaya çalıştığı tamamen benden öte.
BalusC

4
kullanım Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));çizgilerini korumak için
Marc Johnen

275

Android için yazıyorsanız bunu yapabilirsiniz ...

android.text.Html.fromHtml(instruction).toString()

12
Harika bir ipucu. :) Metni bir TextView'de görüntülüyorsanız, bazı biçimlendirmeleri korumak için .toString () yöntemini de bırakabilirsiniz.
Lorne Laliberte

1
@Branky Denemedim ... Kabul edilen cevap cazibe gibi çalışıyor
Maverick

Harika çalışıyor. Tüm html etiketleri Dizeden kaldırıldı.
user3144836

1
Bu iyi, ancak <img> etiketleri bazı tuhaf şeylerle değiştirildi. Ben bir görüntü vardı küçük kareler var
Bibaswann Bandyopadhyay

1
@BibaswannBandyopadhyay başka bir cevap bu karakterlerden kurtulmak yardımcı olur
Vince

84

Kullanıcı girerse <b>hey!</b>, görüntülemek <b>hey!</b>ister hey!misiniz? Birincisi, daha az tondan kaçın ve html kodlaması ve işaretleri (ve isteğe bağlı olarak tırnak işaretleri) ve sorun yok. İkinci seçeneği uygulamak için kodunuzda yapılacak bir değişiklik:

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

ancak kullanıcı gibi biçimlendirilmiş bir şey girerse sorunla karşılaşırsınız <bhey!</b>.

Ayrıca "kirli" html giriş ayrıştırmak ve size metin tutarak, etiketleri kaldırmak için bir yol vermek JTidy kontrol edebilirsiniz .

HTML'yi şeritlemeye çalışırken sorun, tarayıcıların çok yumuşak ayrıştırıcılara sahip olması, bulabileceğiniz herhangi bir kitaplıktan daha yumuşak olması, bu nedenle tüm etiketleri şeritlemek için elinizden gelenin en iyisini yapsanız bile (yukarıdaki değiştirme yöntemini, bir DOM kitaplığını veya JTidy'i) , olur yine çıktı güvenliğinin korunması için kalan HTML özel karakterler kodlamak için emin olmak gerekir.


1
Html düğümü içeriğinde çıkışsız <veya> işareti varsa da sorunlarla karşılaşırsınız. <span> Yaşım <çok fazla metin> sonra yaşınız </span>. node.getText () kullanmak için bunu sadece% 100 yolu bazı XML DOM arayüzü (SAX veya benzeri gibi) üzerinden olduğunu düşünüyorum.
Mitja Gustin

29

Başka bir yol, metni çıkarmak için javax.swing.text.html.HTMLEditorKit kullanmaktır .

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: Yalnızca TEXT ayıklamak için bir dosyadan HTML etiketlerini kaldırın


5
"A <b veya b> c" nin sonucu "ta veya b> c" dir ve talihsiz görünmektedir.
dfrankow

1
Bu benim için en iyisi oldu. Satır sonlarını korumam gerekiyordu. Ayrıştırıcıya bu basit yöntemi ekleyerek yaptım: @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: a <b veya b> c matematiksel ifadesi html biçiminde şu şekilde yazılmalıdır: a <lt; b veya b & gt; c
MiguelMunoz

24

Html etiketleri filtrelemek için en basit yolu olduğunu düşünüyorum:

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("");
}

18

Ayrıca kullanımı çok basit Jericho ve biçimlendirmenin bazılarını koruyabilirsiniz (örneğin satır sonları ve bağlantılar).

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());

4
Jericho <br> bir satır sonu ayrıştırabildi. Jsoup ve HTMLEditorKit bunu yapamadı.
homaxto

Jericho bu işi çok yetenekli, sahip olduğu projelerde çok kullandı.
Jerry Tian

3
Jericho bir cazibe gibi çalıştı. Önerin için teşekkürler. Bir not: tüm dizenin bir Segmentini oluşturmak zorunda değilsiniz. Kaynak Segmenti genişletir, bu nedenle her iki Renderer yapıcısında da çalışır.
MrPlough

Jerico şimdi biraz tarihli gibi görünüyor (son sürüm 2015'in sonlarında 3.4 idi). Ancak, hala iyi çalışıyorsa, yine de iyi çalışır!
Jonathan Hult

17

Jsoup.parse(html).text()Yapmanın kabul edilen cevabının sadece 2 potansiyel sorunu vardır (JSoup 1.7.3 ile):

  • Metinden satır sonlarını kaldırır
  • Metni &lt;script&gt;dönüştürür<script>

Bunu XSS'ye karşı korumak için kullanırsanız, bu biraz sinir bozucu. İşte JSoup ve Apache StringEscapeUtils kullanarak gelişmiş bir çözümde en iyi çekim:

// 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);

Son adım, çıktıyı düz metin olarak kullanmam gerektiğidir. Yalnızca HTML çıktısına ihtiyacınız varsa, onu kaldırabilirsiniz.

Ve işte bir grup test durumu (çıktıya giriş):

{"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"}

Daha iyi bir yol bulursanız, lütfen bana bildirin.


2
Bu gibi bir şeye karşı başarısız olacaktır &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. Aynı şey geçerli &#x26;. JSoup dönüştürmez &lt;script&gt; into <script>, çünkü StringEscapeUtils.unescapeHtmlJSoup girdiyi temizledikten sonra çağırır .
Guillaume Polet

15

Android'de şunu deneyin:

String result = Html.fromHtml(html).toString();

Bunu başardın! tüm satır içi html'yi metinden kaldırdı :)
DritanX

1
Normal kod için her zaman kod parçacıkları kullanırsınız. Kod Parçacıklarının yalnızca HTML veya javascript veya tarayıcıda çalıştırılabilen diğer kodlar için kullanılması gerekir. Java'yı tarayıcıda çalıştıramazsınız. Gelecekte normal kod bloklarını kullanın ... Bu sefer sizin için cevabınızı düzenleyeceğim ve biçimlendirme vb. Düzelteceğim, ancak lütfen bunu gelecekte yapmayın. Sana bunu ilk defa söylemedim ...
Xaver Kapeller

1
@PaulCroarkin bu android sdk içindeki kütüphane. android.text.Html
Ameen Maheen

1
Muhteşem. Tüm html etiketleri kaldırıldı.
user3144836


11

HTML Kaçış doğru yapmak gerçekten zor-kesinlikle bunu yapmak için kütüphane kodu kullanmanızı öneririz, çünkü düşündüğünüzden çok daha ince. Bu Java ile işlemek için oldukça iyi bir kütüphane için Apache's StringEscapeUtils göz atın .


Bu aradığım bir şey ama HTML'den kaçmak yerine çıkarmak istiyorum.
Mason

html'yi çıkarmak istiyor musunuz, yoksa düz metne dönüştürmek mi istiyorsunuz? HTML'yi br etiketleri ve HTML objeleri ile uzun bir dizeden çıkarmak, okunaksız bir karışıklığa neden olabilir.
Tim Howland

4
StringEscapeUtils.unescapeHtml html'yi şeritlemiyor
Erin Drummond

5
Kaçış için kullanılacak ancak soruyu cevaplamayan araçlar hakkında iyi bilgiler.
Alex

3
Kafa karıştırıcı cevap. Removal! = Kaçınma
Lluis Martinez

7

Bu çalışmalı -

bunu kullan

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

ve bu

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.

1
Genellikle, kodların ne yapmak istediğine dair bir açıklama içeriyorsa, cevaplar çok daha kullanışlıdır.
Peter

6

Tim'in önerdiği gibi okunamayan bir karışıklık haline gelmesini önlemek için HTML'yi çıkarmadan önce yeni satırlarla değiştirmek <br/>ve </p>etiketlemek isteyebilirsiniz .

HTML etiketlerini kaldırmayı ancak köşeli parantezler arasında HTML dışı bırakmayı düşünebileceğim tek yol , bir HTML etiketi listesine karşı kontrol olacaktır . Bu çizgiler boyunca bir şey ...

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

Sonra HTML gibi kodları çözmek için özel karakterler &amp;. Sonuç sterilize edilmiş sayılmamalıdır.


5

Alternatif olarak, HtmlCleaner kullanılabilir :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}

2
HtmlCleaner iyi çalışıyor, satır sonlarını koruyor ve son sürümü yayınlandı (Mayıs 2017'de 2.21).
Jonathan Hult

4

Belirttiğim test senaryosu için kabul edilen cevap benim için çalışmadı: "a <b veya b> c" nin sonucu "ab veya b> c" dir.

Bunun yerine TagSoup kullandım. İşte test durumumda (ve diğer birkaç kişide) çalışan bir çekim:

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 {
}
}

4

Bu eski olduğunu biliyorum, ama ben sadece HTML filtrelemek için gereken bir proje üzerinde çalışıyordu ve bu iyi çalıştı:

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

bunun yerine:

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

4

Burada, aralar ve listeler için bazı biçimlendirmeleri işlemeye çalışmak için biraz daha etli bir güncelleme var. Amaya'nın çıktısını rehber olarak kullandım.

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));
    }
}

4

kullanım Html.fromHtml

HTML Etiketleri

<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>

Gereğince Android'in resmi Dokümantasyon herhangi etiketler HTML genel bir yedek olarak gösterecektir dize program daha sonra geçmesi ve gerçek ile yerine dizeleri .

Html.formHtmlyöntemi bir Html.TagHandlerve Html.ImageGetter argüman olarak yanı sıra ayrıştırılacak metin alır.

Misal

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

Sonra

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

Çıktı

Bu, kullanıcının profiline koyabileceği bir metin hakkında


1
Ekstra yardımcı program yok ve Android Dokümanlar ile hizalanıyor. +1
davidbates

4

İşte hepsinin nasıl değiştirileceğine dair bir başka değişken (HTML Etiketleri | HTML Varlıkları | HTML içeriğinde boş alan)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); burada içerik bir String'dir.


1
Biraz geliştirdim: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { code} Çünkü çoğu zaman bu etiketler metnin hemen yanındadır. Ve etiketleri kaldırdıktan sonra 2 ve daha fazla yazma alanını sadece 1 olarak değiştirin.
Ondřej Stašek

4

Android'in varsayılan HTML filtresini kullanabilirsiniz

    public String htmlToStringFilter(String textToFilter){

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

    }

Yukarıdaki yöntem, girişiniz için HTML filtrelenmiş dizesini döndürür.


3

Başka bir yol da com.google.gdata.util.common.html.HtmlToText sınıfını aşağıdaki gibi kullanmak olabilir:

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

Bu kurşun geçirmez kod olsa da değil ve ben wikipedia girişlerinde çalıştırdığınızda ben de stil bilgisi alıyorum. Ancak küçük / basit işler için bunun etkili olacağına inanıyorum.


3

HTML'den düz metne geçmek istediğiniz gibi geliyor.
Bu durumda www.htmlparser.org adresine bakın. Aşağıda, bir URL'de bulunan html dosyasındaki tüm etiketleri çıkaran bir örnek yer almaktadır.
Bu yararlanır org.htmlparser.beans.StringBean .

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

2

İşte bunu yapmanın başka bir yolu:

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;
}

Veya sadece (input.indexOf ("<")> 0 || input.indexOf (">")> 0) "" döndürürse; başka dönüş girdisi;
Hossein Shahdoost

2

Bir de kullanabilirsiniz Apache Tika bu amaçla. Varsayılan olarak, belirli durumlarda istenebilecek boşlukları soyulmuş html'den korur:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())

1
Ayrıştırma yönteminin lehine kaldırıldığını unutmayın Parse.parse(InputStream, ContentHandler, Metadata, ParseContext).
Jacob van Lingen

1

JSoup ile yeni satır bilgilerini tutmanın bir yolu, tüm yeni satır etiketlerinin önüne kukla bir dize koymak, JSoup yürütmek ve kukla dize yerine "\ n" koymaktır.

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");

1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 

3
Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
Filnor

0

5 sentim:

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);
}

0

Biçimlendirilmiş düz html metni almak için şunları yapabilirsiniz:

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/>");

Biçimlendirilmiş düz metin almak için \ n ile <br/> değiştirin ve son satırı şu şekilde değiştirin:

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

0

Bu sorunun sorulmasından bu yana bir süre geçtiğini biliyorum, ama başka bir çözüm buldum, bu benim için işe yaradı:

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

-1

basitçe birden fazla replaceAll () ile bir yöntem yapabilirsiniz.

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

İhtiyacınız olan en yaygın değiştirmeler için bu bağlantıyı kullanın: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html

Basit ama etkilidir. İlk önce önemsiz kaldırmak için değil ama ilk satırı yani replaceAll ("\ <. *?>", "") Kaldırmak için bu yöntemi kullanın ve daha sonra dizinleri aramak ve sonra .substring (start, end) kullanmak için belirli anahtar kelimeler kullanın ) gereksiz şeyleri ayırma yöntemi. Bu daha sağlam olduğundan ve tüm html sayfasında tam olarak ihtiyacınız olanı işaretleyebilirsiniz.


4
İki not. İlk olarak, bu en düşük değerdir - her replaceAll çağrısı için Java, ilk argümanı normal ifade olarak derlemeye ve bu normal ifadeyi dizeye uygulamak için tüm dizeyi çalıştırmaya çalışır ve her seferinde normal bir HTML sayfası için birkaç düzine KB işleme koyar. İkincisi, basit (regex olmayan) dizeleri değiştirmek için replaceAll kullanmamanız, bunun yerine replace () kullanmanız önerilir (adın aksine, hepsinin de yerini alır).
fwielstra

-1

HTML etiketlerini dizeden kaldırın. Bir yerde, sunucudan Httpresponse gibi bazı yanıtlar tarafından alınan bazı dizeleri ayrıştırmamız gerekiyor.

Bu yüzden ayrıştırmamız gerekiyor.

Burada html etiketlerini dizeden nasıl kaldıracağımı göstereceğim.

    // 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

Nereden geliyorsun new System.Text.RegularExpressions.Regex();?
beresfordt

1
@beresfordt bu yanıt .NET için geçerlidir, Java gibi soruda istenmedi
Erin Drummond
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.