[Java] aus HTML String einen link herausfiltern

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von SoSick, 29. August 2010 .

  1. 29. August 2010
    aus HTML String einen link herausfiltern

    Hi,

    ich hab folgendes Problem:

    Ich will in Java (bin an einer Android App dran) aus einem String der verschiedene HTML Tags und auch normalen Text enthält aus nem <img> Tag den Source Link rausfiltern.
    Der String sieht etwa so aus:

    Code:
    <p>blablablblablabla<br /> 
    blablablblablabla
    <img src=http://link.de/bild.png alt=bla title=bla width=220 height=380 class=alignnone size-medium wp-image-4777 /><br /> 
    blablablblablabla<br /> 
    <a href=http://irgendeinlink.de>link</a></p>
    einen regulären ausdruck hab ich eigentlich schon: <img(.*?) src=([^\"]*) (.*?)>
    nur finde ich in java bisher keine möglichkeit den link als String zu bekommen.

    Ich steh momentan etwas auf dem Schlauch kann mir vllt. jemand helfen?

    LG
     
  2. 30. August 2010
    AW: aus HTML String einen link herausfiltern

    Code:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class LinkGetter {
     private Pattern htmltag;
     private Pattern link;
     private final String root;
    
     public LinkGetter(String root) {
     this.root = root;
     htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>");
     link = Pattern.compile("href=\"[^>]*\">");
     }
    
     public List<String> getLinks(String url) {
     List<String> links = new ArrayList<String>();
     try {
     BufferedReader bufferedReader = new BufferedReader(
     new InputStreamReader(new URL(url).openStream()));
     String s;
     StringBuilder builder = new StringBuilder();
     while ((s = bufferedReader.readLine()) != null) {
     builder.append(s);
     }
    
     Matcher tagmatch = htmltag.matcher(builder.toString());
     while (tagmatch.find()) {
     Matcher matcher = link.matcher(tagmatch.group());
     matcher.find();
     String link = matcher.group().replaceFirst("href=\"", "")
     .replaceFirst("\">", "");
     if (valid(link)) {
     links.add(makeAbsolute(url, link));
     }
     }
     } catch (MalformedURLException e) {
     e.printStackTrace();
     } catch (IOException e) {
     e.printStackTrace();
     }
     return links;
     }
    
     private boolean valid(String s) {
     if (s.matches("javascript:.*|mailto:.*")) {
     return false;
     }
     return true;
     }
    
     private String makeAbsolute(String url, String link) {
     if (link.matches("http://.*")) {
     return link;
     }
     if (link.matches("/.*") && url.matches(".*$[^/]")) {
     return url + "/" + link;
     }
     if (link.matches("[^/].*") && url.matches(".*[^/]")) {
     return url + "/" + link;
     }
     if (link.matches("/.*") && url.matches(".*[/]")) {
     return url + link;
     }
     if (link.matches("/.*") && url.matches(".*[^/]")) {
     return url + link;
     }
     throw new RuntimeException("Cannot make the link absolute. Url: " + url
     + " Link " + link);
     }
    }
    
    
    Vllt kann dir das ja was helfen kannst ja code stücke aus der Methode nehmen.
    Ich hoffe ich hab deine Frage richtig verstanden xD

    mfg
     
  3. 30. August 2010
    AW: aus HTML String einen link herausfiltern

    Füg deinen Ausdruck oben ins Beispiel ein und du bekommst ein Array mit allen Treffers als Rückgabe. Wie du das ausliest sollte klar sein. Ich glaube Google hätte dir mit den Stichworten: Java, Regex, URL - auch geholfen.

    Und rushzero könnte auch mal Credits geben, man kopiert nicht irgendeinen Code ohne Erklärung:

    Java Regex - Tutorial
     
  4. 30. August 2010
    AW: aus HTML String einen link herausfiltern

    danke ich werd mal schaun ob ich damit weiterkomme
     
  5. 30. August 2010
    AW: aus HTML String einen link herausfiltern

    Code:
    htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>");
    besser:
    Code:
    htmltag = Pattern.compile("<a.*href=\"[^\"]*\".*>(.*)</a>");
    ----

    Code:
     private String makeAbsolute(String url, String link) {
     if (link.matches("http://.*")) {
     return link;
     }
     if (link.matches("/.*") && url.matches(".*$[^/]")) {
     return url + "/" + link;
     }
     if (link.matches("[^/].*") && url.matches(".*[^/]")) {
     return url + "/" + link;
     }
     if (link.matches("/.*") && url.matches(".*[/]")) {
     return url + link;
     }
     if (link.matches("/.*") && url.matches(".*[^/]")) {
     return url + link;
     }
     throw new RuntimeException("Cannot make the link absolute. Url: " + url
     + " Link " + link);
     }
    
    besser:
    Code:
    private String makeAbsolute(String url, String link) {
     if(link.matches("^http://"))
     return link;
     
     if(link.charAt(0) == '/') {
     if(url.charAt(url.length) == '/')
     url = url.substring(0, url.length - 1);
     } else if(url.charAt(url.length) != '/')
     url += "/";
     
     return url + link;
    }
    
     
  6. 30. August 2010
    AW: aus HTML String einen link herausfiltern

    müsste das nicht so aussehen?

    Code:
    htmltag = Pattern.compile("<a.*?href=\"[^\"]*\".*?>(.*?)</a>");
    ohne die fragezeichen würde er bei 2 links hintereinander durcheinander kommen.
     
  7. 31. August 2010
    AW: aus HTML String einen link herausfiltern

    Du hast Recht. Über das gierige Verhalten von Regex bin ich auch schon des öfteren gestolpert. Die Fragezeichen sorgen dafür, dass die Regex "Maschine" aufhört, wenn das 1. Vorkommnis gefunden wird. Dadurch wird nicht bis zum Ende weitergesucht.

    greez
     
  8. 31. August 2010
    AW: aus HTML String einen link herausfiltern

    naja, da ein link nicht innerhalb eines links vorkommen sollte kann man das auch weglassen mmn.
    die einzige situation wo ggf. fehlerhaft wäre ist <a href="...">...</a>... <a name="...">...</a>
    probieren geht über studieren.
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.