2010-05-05 3 views
0

Я пытаюсь разобрать полученные поисковые запросы от поисковых систем bing, которые получены в xhtml в java. Я использую sax XmlReader для чтения результатов, но я продолжаю получать ошибки. вот мой код, это один для Hadler читателя:Parsing XHTML результаты от Bing

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"); 
     } 

} 

и это сама программа:

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"); 
    } 
} 

это мое сообщение об ошибке:

 
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) 

может кто-то помочь? я думаю, что это что-то делать с ОТД, но я не знаю, жарко, чтобы исправить

+1

Не имеет ли Bing какой-либо веб-сервис, который вы можете использовать, вместо экрана, соскабливающего их HTML? – voyager

+1

@voyager: Я согласен. Я думаю, это может быть то, о чем вы говорите: http://msdn.microsoft.com/en-us/library/dd900818.aspx –

ответ

1

Сервер вернул код ответа HTTP: 503 для URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

Очевидно, что вы пытаетесь разобрать XHTML-документ, использующий анализатор внешних сущностей. Он перетаскивает внешний поднабор DTD, чтобы он мог читать любые объявления для объектов, специфичных для HTML, таких как &nbsp; или &eacute;.

Вы получаете HTTP 503 с сервера w3.org, на котором размещен этот внешний подтип DTD, но даже если бы вы не были, это было бы все еще очень невежливо, чтобы бомбардировать этот сервер запросами на DTD каждый время, которое вы очищаете. (Может быть, они вас блокируют именно по этой причине?)

Вы можете создать EntityResolver, чтобы вернуть свою собственную локальную копию DTD или версию с уменьшенной версией, которая включает только определения сущностей. Или вы можете попросить читателя вообще не получать DTD, используя setFeature, чтобы отключить эту опцию, если у вас есть поддержка XMLReader. (например, for Xerxes.) Хотя тогда у вас могут возникнуть проблемы, если документ содержит нестроенные сущности, такие как &nbsp;.

Кроме того, поскольку это живая веб-страница, которая служит text/html, и особенно потому, что она исходит от Microsoft, вероятно, довольно оптимистично предположить, что она будет хорошо сформирована! Скребок экрана обычно лучше всего делать с парсером, который терпим к прихожанам HTML. Но, как говорится выше, использование API намного лучше, чем скрипинг экрана в любом случае.

Смежные вопросы