2012-06-03 3 views
4

Я пытаюсь извлечь URL из заданного String, которые содержат HTTP-ответ с тегом HREF. Я дошел до начала ссылок, но мне нужно завершить строку, как только закончится HREF. Как это может быть достигнуто?Извлечь URL из строки HTML

public class Extracturl { 
public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 
    String line; 

    try { 
     String u="http://en.wikipedia.org/wiki/china"; 
     String fileName = "e:\\test.txt"; 
     BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true)); 
     url = new URL(u); 
     is = url.openStream(); // throws an IOException 
     dis = new DataInputStream(new BufferedInputStream(is)); 

     String w=new String(); 
     while ((line = dis.readLine()) != null) { 


       try { 
    if(line.contains("href=\"/wiki")&&line.contains("\" />")&& (!line.contains("File"))) 
        { 

        if(!w.contains(line.substring(line.indexOf("href=\"/")))) 
        {w=w+line.substring(line.indexOf("href=\"/"));       
         System.out.println(line.substring(line.indexOf("href=\"/"))); 
        writer.write(w); 
        writer.newLine(); 
        }} 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
     } 
    } catch (MalformedURLException mue) { 
     mue.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 

      // writer.close(); 
     } catch (IOException ioe) { 
      // nothing to see here 
     } 
    } 
} 

    } 

Я даже попытался

w=w+line.substring(line.indexOf("href=\"/"),line.indexOf("\">")); 

Но это дало мне ошибку.

Моя цель - получить все URL-адреса, которые связаны со страницей.

+3

Используйте HTML-парсер для этой цели. –

+0

@GuillaumePolet Отличный комментарий, но я думаю, что это даст лучший ответ. См. [Является ли «Не делать этого» действительный ответ?] (Http://meta.stackexchange.com/questions/8891/is-dont-do-it-a-valid-answer) –

+0

@GuillaumePolet, прежде чем говорить дон Не делайте этого, расскажите, как это можно сделать по-другому. –

ответ

4

Используйте для этого HTML-парсер. Вот пример со встроенным Java-парсером Java. Есть и другие варианты, такие как JSoup, но для основной обработки HTML, это делает очень хорошую работу:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.LinkedHashSet; 
import java.util.Set; 

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

public class URLExtractor { 

    private static class HTMLPaserCallBack extends HTMLEditorKit.ParserCallback { 

     private Set<String> urls; 

     public HTMLPaserCallBack() { 
      urls = new LinkedHashSet<String>(); 
     } 

     public Set<String> getUrls() { 
      return urls; 
     } 

     @Override 
     public void handleSimpleTag(Tag t, MutableAttributeSet a, int pos) { 
      handleTag(t, a, pos); 
     } 

     @Override 
     public void handleStartTag(Tag t, MutableAttributeSet a, int pos) { 
      handleTag(t, a, pos); 
     } 

     private void handleTag(Tag t, MutableAttributeSet a, int pos) { 
      if (t == Tag.A) { 
       Object href = a.getAttribute(HTML.Attribute.HREF); 
       if (href != null) { 
        String url = href.toString(); 
        if (!urls.contains(url)) { 
         urls.add(url); 
        } 
       } 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     InputStream is = null; 
     try { 
      String u = "http://en.wikipedia.org/wiki/china"; 
      URL url = new URL(u); 
      is = url.openStream(); // throws an IOException 
      HTMLPaserCallBack cb = new HTMLPaserCallBack(); 
      new ParserDelegator().parse(new BufferedReader(new InputStreamReader(is)), cb, true); 
      for (String aUrl : cb.getUrls()) { 
       System.out.println("Found URL: " + aUrl); 
      } 
     } catch (MalformedURLException mue) { 
      mue.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException ioe) { 
       // nothing to see here 
      } 
     } 
    } 
} 
+0

Выполнено, поскольку оно дано .. но не генерируется вывод. –

+1

@ratankumar даже здесь с поезда он работал (и соединение действительно плохое) –

+0

извините! моя ошибка, работает абсолютно идеально. Благодаря !!!! –