# Text aus Web-Seiten auslesen



## turmaline (17. Dez 2009)

Hallo Zusammen,

es geht um Folgendes:

ich habe eine Klasse WebSiteReader.java (siehe unten), die den Text einer Web-Seite auslesen und als String zurückgeben muss. Den Code habe ich aus verschiedenen Foren zusammengeschnitten, so wie ich das brauche und habe bereits mit verschiedenen Links ausprobiert. Das funktioniert.
Nun habe ich ein Problem. Ich muss den WebSiteReader.java in Zusammenarbeit mit einem AnnotationService (für mich blackbox) verwenden, der den Text von WebSiteReader mit Begriffen aus einer Ontologie annotieren muss.

Nach dem Aufruf des WebSiteReader, wird der AnnotationService aufgerufen, ungefähr so:

String textToAnnotate = util.getTextFromHTML(url, myProxyPort, myProxy);

as = annotationservice.client.Client.annotateText(textToAnnotate, urlOnto, strategy, serviceURL);

Da bekomme ich aber eine Exception:
Exception in thread "main" org.apache.axis2.AxisFault: Software caused connection abort: recv failed
(Die vollständige Fehlermeldung siehe nach dem Quellcode).
Also WebSiteReader und AnnotationService wolle noffensichtlich nicht zusammen arbeiten und es liegt nicht am Text, der übergeben wird. Diese zwei Aufrufe funktionieren in der Reihenfolge WebSiteReader -> AnnotationService nicht (umgekehrt aber schon).

Irgendwas stimmt mit der Klasse WebSiteReader nicht (mit den Einstellungen der Systemeigenschften, Connection ooder oder oder). Ich bitte um Hilfe! ???:L
Und Leute, bitte einfacher erklären, habe im Programmieren nicht viel Erfahrung.

Mein Betriebsystem: Windows XP
Entwicklungsumgebung: Eclipse
Java 1.6

Ich hoffe, ich habe genügend Informationen geliefert.

Gruss, Anja


```
package MyUtilities;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;

import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

public class WebSiteReader 
{
	
	public String getTextFromHTML (URL url, String myProxyPort, String myProxy)
	{
		try
		{
			
		   if(myProxyPort != null && myProxy != null)
		   {
			   Properties systemSettings = System.getProperties();
			   systemSettings.put("http.proxyPort", myProxyPort);
			   systemSettings.put("http.proxyHost", myProxy);
		   }
			
	        URLConnection connection = url.openConnection( );
	        InputStream is = connection.getInputStream( );
	        InputStreamReader isr = new InputStreamReader(is);
	        BufferedReader br = new BufferedReader(isr);
	        
	        
	        
	        String content = "";
	        
	        HTMLEditorKit htmlKit = new HTMLEditorKit( );
	        HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument( );
	        HTMLEditorKit.Parser parser = new ParserDelegator( );
	        HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
	        parser.parse(br, callback, true);
	        
	        is.close();
	        isr.close();
	        br.close();
	        
	        for (HTMLDocument.Iterator iterator = htmlDoc.getIterator(HTML.Tag.CONTENT); iterator
	        .isValid(); iterator.next())
	        {
	        	
	        	int startOffset = iterator.getStartOffset();
	        	int endOffset = iterator.getEndOffset();
	        	int length = endOffset - startOffset;
	        	String text = htmlDoc.getText(startOffset, length);
	        	content += text;
	        }
	       
			return content;
			
		}
	       /* catch(MalformedURLException e0) 
			{
				// TODO Auto-generated catch block
				System.out.println("Überprüfen Sie die Schreibweise der URL und versuchen Sie es erneut.");
				//e0.printStackTrace();
				return null;
			}*/
			catch (IOException e1)
			{
				e1.printStackTrace();
				return null;
			}
			catch ( BadLocationException e2)
			{
				e2.printStackTrace();
				return null;
			}
			finally
			{
				
			}
	        
		      
	}
}
```

**********************
Fehlermeldung:

Exception in thread "main" org.apache.axis2.AxisFault: Software caused connection abort: recv failed
	at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
	at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
	at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
	at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:371)
	at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:209)
	at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:448)
	at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:401)
	at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
	at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
	at org.eu_orchestra.oa.annotationservice.AnnotationServiceStub.annotateText(AnnotationServiceStub.java:331)
	at de.fraunhofer.iitb.annotationservice.client.Client.annotateText(Client.java:95)
	at Test1.doTest3(Test1.java:88)
	at Test1.main(Test1.java:582)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.read(SocketInputStream.java:129)
	at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
	at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
	at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
	at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
	at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
	at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.readLine(MultiThreadedHttpConnectionManager.java:1413)
	at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
	at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
	at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:542)
	at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:189)
	... 11 more


----------



## turmaline (17. Dez 2009)

Dank meinem Kollegen habe ich das Problem lösen können. Und zwar, es lag daran, dass ich im WebSiteReader proxyPort und proxyHost gesetzt habe und der AnnotationService wurde intern aufgerufen -> deswegen hat es geknallt. Unten findet man den verbesserten Code. Nun habe ich eine test.properties Datei angelegt, in der drin die Einstellungen gespeichert werden (statt Sternzeichen sollen richtige Einstellungen rein):

proxyHost=** 
proxyPort=**
nonProxyHosts=localhost

...und vor dem Aufruf des WebSiteReader wird sie ausgelesen:


```
Properties props = new Properties();
props.load(new FileInputStream(new File("C:/workspace/AnnotationService/test.properties")));
			
			if (props.getProperty("proxyHost") != null && props.getProperty("proxyPort") != null)
			{
				Properties systemSettings = System.getProperties();
				systemSettings.put("http.proxyHost", props.getProperty("proxyHost"));
				systemSettings.put("http.proxyPort", props.getProperty("proxyPort"));
				if (props.getProperty("nonProxyHosts") != null)
				{
					systemSettings.put("http.nonProxyHosts", '"' + props.getProperty("nonProxyHosts") + '"');
					System.out.println(systemSettings.getProperty("http.nonProxyHosts"));
				}
			}
```

.... und hier der verbesserte Code vom WebSiteReader


```
package MyUtilities;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;

import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;



public class WebSiteReader
{

 public String getTextFromHTML(URL url)
  {
    final StringBuilder content = new StringBuilder();
    InputStream is = null;
    
    try
    {
      URLConnection connection = url.openConnection();
      is = connection.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);

      HTMLEditorKit htmlKit = new HTMLEditorKit();
      HTMLDocument htmlDoc = (HTMLDocument)htmlKit.createDefaultDocument();
      HTMLEditorKit.Parser parser = new ParserDelegator();
      HTMLEditorKit.ParserCallback callback = htmlDoc.getReader(0);
      parser.parse(br,callback,true);


      for (HTMLDocument.Iterator iterator = htmlDoc.getIterator(HTML.Tag.CONTENT); iterator.isValid(); iterator.next())
      {

        int startOffset = iterator.getStartOffset();
        int endOffset = iterator.getEndOffset();
        int length = endOffset - startOffset;
        String text = htmlDoc.getText(startOffset,length);
        content.append(text);
      }
    }
    catch (IOException e1)
    {
      e1.printStackTrace();
      return null;
    }
    catch (BadLocationException e2)
    {
      e2.printStackTrace();
      return null;
    }
    finally
    {
      if (is != null)
      {
        try
        {
          is.close();
        }
        catch (IOException e)
        {
          // FUBAR
        }
      }
    }

    return content.toString();
  }
}
```


----------

