2010-05-05 5 views
0

자바에서 xhtml로 수신되는 빙 검색 엔진에서받은 검색 쿼리를 구문 분석하려고합니다. 나는 색소폰 XmlReader를 사용하여 결과를 읽었으나 오류가 계속 발생한다. 여기 내 코드이 하나가 독자의 hadler위한이다 :Bing에서 XHTML 결과를 구문 분석

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 


public class XHTMLHandler extends DefaultHandler{ 
    public XHTMLHandler() 
    { 
     super(); 
    } 
    public void startDocument() 
    { 
     System.out.println("Start document"); 
    } 
    public void endDocument() 
    { 
    System.out.println("End document"); 
    } 
    public void startElement (String uri, String name,String qName, Attributes atts) 
    { 
     if ("".equals (uri)) 
       System.out.println("Start element: " + qName); 
      else 
       System.out.println("Start element: {" + uri + "}" + name); 
    } 

    public void endElement (String uri, String name, String qName) 
    { 
    if ("".equals (uri)) 
     System.out.println("End element: " + qName); 
    else 
     System.out.println("End element: {" + uri + "}" + name); 
    } 
    public void startPrefixMapping (String prefix, String uri) 
     throws SAXException { 
    } 
    public void endPrefixMapping (String prefix) 
     throws SAXException { 
    } 



    public void characters (char ch[], int start, int length) 
     { 
     System.out.print("Characters: \""); 
     for (int i = start; i < start + length; i++) { 
      switch (ch[i]) { 
      case '\\': 
      System.out.print("\\\\"); 
      break; 
      case '"': 
      System.out.print("\\\""); 
      break; 
      case '\n': 
      System.out.print("\\n"); 
      break; 
      case '\r': 
      System.out.print("\\r"); 
      break; 
      case '\t': 
      System.out.print("\\t"); 
      break; 
      default: 
      System.out.print(ch[i]); 
      break; 
      } 
     } 
     System.out.print("\"\n"); 
     } 

} 

이 프로그램 자체입니다 :

 
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    at Searching.SearchBing(Searching.java:57) 
    at Searching.main(Searching.java:65) 

이 내 오류 메시지가

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpRetryException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.XMLReaderFactory; 


public class Searching { 
    private String m_urlBingSearch = "http://www.bing.com/search?q="; 
    private HttpURLConnection m_httpCon; 
    private OutputStreamWriter m_streamWriter; 
    //private BufferedReader m_bufferReader; 
    private URL m_serverAdress; 
    private StringBuilder sb; 
    private String m_line; 
    private InputSource m_inputSrc; 
    public Searching() 
    { 

     m_httpCon = null; 
     m_streamWriter = null; 
     //m_bufferReader = null; 
     m_serverAdress = null; 
     sb = null; 
     m_line = new String(); 
    } 
    public void SearchBing(String searchPrms) throws SAXException,IOException 
    { 


      //set up connection 
      sb = new StringBuilder(); 
      sb.append(m_urlBingSearch); 
      sb.append(searchPrms); 
      m_serverAdress = new URL(sb.toString()); 
      m_httpCon = (HttpURLConnection)m_serverAdress.openConnection(); 
      m_httpCon.setRequestMethod("GET"); 
      m_httpCon.setDoOutput(true); 
      m_httpCon.setConnectTimeout(10000); 
      m_httpCon.connect(); 
      //m_streamWriter = new OutputStreamWriter(m_httpCon.getOutputStream()); 
      //m_bufferReader = new BufferedReader(new InputStreamReader(m_httpCon.getInputStream())); 
      XMLReader reader = XMLReaderFactory.createXMLReader(); 
      XHTMLHandler handle = new XHTMLHandler(); 
      reader.setContentHandler(handle); 
      reader.setErrorHandler(handle); 
      //reader.startPrefixMapping("html", "http://www.w3.org/1999/xhtml"); 
      handle.startPrefixMapping("html", "http://www.w3.org/1999/xhtml"); 
      m_inputSrc = new InputSource(m_httpCon.getInputStream()); 
      reader.parse(m_inputSrc); 
      m_httpCon.disconnect(); 


    } 
    public static void main(String [] args) throws SAXException,IOException 
    { 
     Searching s = new Searching(); 
     s.SearchBing("beatles"); 
    } 
} 

입니다 누군가 도와 주실 수 있습니까? 나는 DTD 함께 할 수있는 뭔가가 생각하지만 난 서버가 반환 HTTP 응답 코드

+1

Bing은 HTML을 스크랩하는 대신 사용할 수있는 일종의 웹 서비스가 있습니까? – voyager

+1

@voyager : 동의합니다. 나는 이것이 당신이 말하는 것일 수 있다고 생각합니다 : http://msdn.microsoft.com/en-us/library/dd900818.aspx –

답변

1

를 해결하기 위해 뜨거운 모르는 : 503 URL에 대한 : http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 분명히

당신은 구문 분석을 시도하고 외부 엔티티 가져 오기 구문 분석기를 사용하는 XHTML 문서 그것은 &nbsp; 또는 &eacute;과 같은 HTML 특정 엔터티에 대한 선언을 읽을 수 있도록 DTD 외부 하위 집합에서 드래그합니다.

현재 DT3 외부 서브넷을 호스팅하는 w3.org 서버에서 HTTP 503을 받고 있지만 그렇지 않은 경우에도 DTD를 요청할 때마다 서버를 폭격하는 것은 여전히 ​​매우 무례 할 수 있습니다. 당신이 다쳤을 때. 그 이유는 무엇일까?

자신의 로컬 복사본 DTD를 반환하거나 엔티티 정의 만 포함하는 pared-down 버전을 반환 할 수 있습니다. 또는 setFeature을 사용하여 DTD를 전혀 가져 오지 않도록 독자에게 요청하여 XMLReader 구현에서 해당 기능을 지원하는 경우 해당 옵션을 해제 할 수 있습니다. (예 : for Xerxes). 문서에 &nbsp;과 같은 내장되지 않은 엔티티 참조가 포함되어 있으면 문제가 발생할 수 있습니다.

라이브 웹 페이지는 text/html으로 제공되기 때문에 특히 Microsoft에서 제공 한 것이므로 형식이 양호한 것으로 가정하는 것이 좋습니다. 스크린 스크래핑은 일반적으로 HTML 단점을 용인하는 파서로 가장 잘 수행됩니다. 그러나 위에 언급 한 바와 같이 API를 사용하면 화면 스크래핑보다 훨씬 나은 방법이 될 수 있습니다.