Ich versuche, img mit Jsoup zu extrahieren. Es funktioniert gut für Bilder ohne Leerzeichen im Dateinamen, extrahiert jedoch nur den ersten Teil, wenn ein Leerzeichen vorhanden ist.

Ich habe es mit unten versucht.

String result = Jsoup.clean(content,"https://rally1.rallydev.com/", Whitelist.relaxed().preserveRelativeLinks(true), new Document.OutputSettings().prettyPrint(false));
        Document doc = Jsoup.parse(result);
        Elements images = doc.select("img");

Beispielsweise HTML-Inhalt

Description:<div>some text content<br /></div> 
<div><img src=/slm/attachment/43647556403/My file with space.png /></div>
<div><img src=/slm/attachment/43648152373/my_file_without_space.png/></div>

result Inhalt ist:

Description:Some text content<br> <img src="/slm/attachment/43647556403/My"><img src="/slm/attachment/43648152373/my_file_without_space.png/">

In "Ergebnis" für das Bild mit Leerzeichen im Dateinamen hat nur der erste Teil "Mein". Der Inhalt nach Leerzeichen wurde ignoriert.

Wie extrahiere ich einen Dateinamen, wenn dieser Leerzeichen enthält?

2
Etho 23 Dez. 2015 im 08:48

1 Antwort

Beste Antwort

Das Problem kann in Jsoup nicht einfach gelöst werden, da der src -Attributwert des Beispiels mit Leerzeichen korrekt als nur My identifiziert wird. Die Teile file, with und space.png sind in diesem Beispiel ebenfalls Attribute ohne Werte. Natürlich können Sie JSoup verwenden, um die Attributschlüssel, die dem src-Attribut folgen, auf ihren Wert zu verketten. Zum Beispiel so:

String test =""
        + "<div><img src=/slm/attachment/43647556403/My file with space.png /></div>"
        + "<div><img src=/slm/attachment/43647556403/My file with space.png name=whatever/></div>"
        + "<div><img src=/slm/attachment/43647556403/This  breaks  it.png name=whatever/></div>"
        + "<div><img src=\"/slm/attachment/43647556403/This  works.png\" name=whatever/></div>"
        + "<div><img src=/slm/attachment/43648152373/my_file_without_space.png/></div>";
Document doc = Jsoup.parse(test);
Elements imgs = doc.select("img");
for (Element img : imgs){
    Attribute src = null;
    StringBuffer newSrcVal = new StringBuffer();
    List<String> toRemove = new ArrayList<>();
    for (Attribute a : img.attributes()){
        if (a.getKey().equals("src")){
            newSrcVal.append(a.getValue());
            src = a;
        }
        else if (newSrcVal.length()>0){
            //we already found the scr tag
            if (a.getValue().isEmpty()){
                newSrcVal.append(" ").append(a.getKey());
                toRemove.add(a.getKey());
            }
            else{
                //the empty attributes, i.e. file name parts are over
                break;
            }
        }               
    }
    for (String toRemAttr : toRemove){
        img.removeAttr(toRemAttr);
    }
    src.setValue(newSrcVal.toString());
}
System.out.println(doc);

Dieser Algorithmus durchläuft alle img-Elemente und innerhalb jedes img durchläuft er seine Attribute. Wenn das Attribut src gefunden wird, behält es es als Referenz bei und beginnt, den newSrcBuf StringBuffer zu füllen. Alle folgenden wertlosen Attribute werden zu newSrcBuf hinzugefügt, bis entweder ein anderes Attribut mit Wert gefunden wird oder keine Attribute mehr vorhanden sind. Schließlich wird der Wert des scr-Attributs mit dem Inhalt von newSrcBuf zurückgesetzt und die früheren leeren Attribute werden aus dem DOM entfernt.

Beachten Sie, dass dies nicht funktioniert, wenn Ihr Dateiname zwei oder mehr aufeinanderfolgende Leerzeichen enthält. JSoup verwirft diese Leerzeichen zwischen Attributen und kann daher nach dem Parsen nicht wiederhergestellt werden. Wenn Sie das benötigen, müssen Sie das Eingabe-HTML vor dem Parsen bearbeiten.

2
luksch 23 Dez. 2015 im 10:47