2011-11-30 68 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。