2011-11-30 97 views
2

我正在爬取一個網頁,並在抓取後從網頁中提取所有鏈接,然後我試圖使用Apache Tika和BoilerPipe通過使用下面的代碼解析所有URL解析得非常好,但對於少數XML我得到了以下錯誤。我不確定這個錯誤是什麼意思。我的代碼存在一些問題或XML文件存在一些問題?這是下面的行HTML Parser.java使用Apache Tika解析XML文件

String parsedText = tika.parseToString(htmlStream, md); 

錯誤號100,我是,其具有

org.apache.tika.exception.TikaException: Invalid XML: Error on line 16: Invalid byte 1 of 1-byte UTF-8 sequence. 
     at org.apache.tika.parser.feed.FeedParser.parse(FeedParser.java:75) 

     at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197) 
     at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197) 
     at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:135) 
     at org.apache.tika.Tika.parseToString(Tika.java:357) 
     at edu.uci.ics.crawler4j.crawler.HTMLParser.parse(HTMLParser.java:101) 
     at edu.uci.ics.crawler4j.crawler.WebCrawler.handleHtml(WebCrawler.java:227) 
     at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:299) 
     at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:118) 
     at java.lang.Thread.run(Unknown Source) 

HTMLParser.java代碼 -

public void parse(String htmlContent, String contextURL) { 

    InputStream htmlStream = null; 
    text = null; 
    title = null; 
    metaData = new HashMap<String, String>(); 

    urls = new HashSet<String>(); 
    char[] chars = htmlContent.toCharArray(); 

    bulletParser.setCallback(textExtractor); 
    bulletParser.parse(chars); 

    try { 
     text = articleExtractor.getText(htmlContent); 
    } catch (BoilerpipeProcessingException e) { 
     e.printStackTrace(); 
    } 

    if (text == null){ 
     text = textExtractor.text.toString().trim(); 
    } 

    title = textExtractor.title.toString().trim(); 
    try { 
     Metadata md = new Metadata(); 
     htmlStream = new ByteArrayInputStream(htmlContent.getBytes()); 
     String parsedText = tika.parseToString(htmlStream, md); 
     //very unlikely to happen 
     if (text == null){ 
      text = parsedText.trim(); 
     } 
     processMetaData(md); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     IOUtils.closeQuietly(htmlStream); 
    } 
    bulletParser.setCallback(linkExtractor); 
    bulletParser.parse(chars); 
    Iterator<String> it = linkExtractor.urls.iterator(); 

    String baseURL = linkExtractor.base(); 
    if (baseURL != null) { 
     contextURL = baseURL; 
    } 

    int urlCount = 0; 
    while (it.hasNext()) { 
     String href = it.next(); 
     href = href.trim(); 
     if (href.length() == 0) { 
      continue; 
     } 
     String hrefWithoutProtocol = href.toLowerCase(); 
     if (href.startsWith("http://")) { 
      hrefWithoutProtocol = href.substring(7); 
     } 
     if (hrefWithoutProtocol.indexOf("javascript:") < 0 
       && hrefWithoutProtocol.indexOf("@") < 0) { 
      URL url = URLCanonicalizer.getCanonicalURL(href, contextURL); 
      if (url != null) { 
       urls.add(url.toExternalForm()); 
       urlCount++; 
       if (urlCount > MAX_OUT_LINKS) { 
        break; 
       } 
      }    
     } 
    } 
} 

回答

1

嘗試改變

htmlStream = new ByteArrayInputStream(htmlContent.getBytes()); 

String utfHtmlContent = new String(htmlContent.getBytes(),"UTF-8") 
htmlStream = new ByteArrayInputStream(utfHtmlContent.getBytes()); 

這可能是一個黑客,你可能不希望使用它作爲你的最終解決方案,但如果它開始這個變化,你會知道,輸入原本不是UTF-8後,開始工作。

+0

使用上面的代碼有什麼問題嗎?正如你所說的'這可能是一種黑客攻擊,你可能不想用它作爲你的最終解決方案。在我猜之後開始工作。 – ferhan

+0

取決於你的用例。這迫使內容轉換爲UTF-8。也許內容是故意在其他編碼。如果tika期待UTF-8,這可能是答案,或者當你遇到不是UTF-8的內容時,你可能想拋出自己的異常。 –

+0

感謝您的回答。我有一個問題,但有HTML文件解析問題,因爲一切(代碼)都是相同的。這是該鏈接[http://stackoverflow.com/questions/8319604/parsing-html-issues-with-apache-tika](http://stackoverflow.com/questions/8319604/parsing-html-issues-用的Apache-TIKA) – ferhan

1

異常來自FeedParser類,它表明您要解析的資源是RSS或Atom提要,而不是HTML文檔。

根據異常,您可能正在處理聲明自己爲UTF-8(帶有<?xml version="1.0" encoding="UTF-8"?>前綴)的畸形Feed,但其中包含其他一些非UTF-8編碼中的內容。鑑於嚴峻的XML解析規則,此饋送無法分析,因此您收到的TikaException與預期的一樣。

有關問題的更多詳細信息,我建議您將feed validator指向麻煩的URL。