Разбор XML-файла с использованием Apache Tika - PullRequest
2 голосов
/ 30 ноября 2011

Я сканирую веб-страницу и после сканирования извлекаю все ссылки с этой веб-страницы, а затем пытаюсь проанализировать все URL-адреса, используя Apache Tika и BoilerPipe, используя приведенный ниже код, поэтому для некоторых URL-адресов он выполняется очень хорошо, но для немногихXML я получил следующую ошибку.Я не уверен, что означает эта ошибка.Проблемы с моим кодом или проблемы с файлом XML?И это следующая строка номер 100 в HTML Parser.java

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 code-

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 ]

1 голос
/ 30 ноября 2011

Исключение исходит от класса FeedParser, который указывает, что ресурс, который вы пытаетесь проанализировать, является каналом RSS или Atom, а не документом HTML.

Исходя из исключения, вероятно, что выВы имеете дело с неправильно сформированным фидом, который объявляет себя UTF-8 (с префиксом <?xml version="1.0" encoding="UTF-8"?>), но затем содержит контент в некоторой другой кодировке, отличной от UTF-8.Учитывая драконовские правила синтаксического анализа XML, этот фид не может быть проанализирован, и, следовательно, полученное вами исключение TikaException соответствует ожидаемому.

Для получения более подробной информации о проблеме, я предлагаю вам указать валидатор фидов напроблемный URL.

1 голос
/ 30 ноября 2011

Попробуйте изменить

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

до

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

Это может быть взломом, и вы можете не захотеть использовать его в качестве окончательного решения, но если оно начнет работать после этого изменения, вы будете знать, что исходные данные не были UTF-8.

...