使用Apache Tika解析XML文件

时间:2011-11-30 00:30:58

标签: java parsing apache-tika

我正在抓取一个网页并在抓取之后从该网页中提取所有链接然后我尝试使用Apache Tika和BoilerPipe通过使用下面的代码来解析所有网址,所以对于某些网址它解析得非常好但很少XML我收到以下错误。我不确定这个错误是什么意思。我的代码有些问题或XML文件有些问题?这是HTML Parser.java中的以下第100行

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

我遇到错误 -

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

2 个答案:

答案 0 :(得分:1)

尝试更改

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

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

这可能是一个黑客,您可能不想将它用作最终解决方案,但如果它在此更改后开始工作,您将知道输入最初不是UTF-8。

答案 1 :(得分:1)

例外来自FeedParser类,它表示您尝试解析的资源是RSS或Atom订阅源,而不是HTML文档。

根据例外情况,您可能正在处理格式错误的Feed,声明自己是UTF-8(带有<?xml version="1.0" encoding="UTF-8"?>前缀),但随后包含其他非UTF-8中的内容编码。鉴于XML的严格解析规则,无法解析此订阅源,因此您收到的TikaException符合预期。

有关此问题的详细信息,建议您将feed validator指向麻烦的网址。