Разбор проблем HTML с Apache Tika - PullRequest
0 голосов
/ 30 ноября 2011

Я сканирую веб-страницу и после сканирования извлекаю все ссылки с этой веб-страницы, а затем пытаюсь проанализировать все URL-адреса, используя Apache Tika и BoilerPipe, используя приведенный ниже код, поэтому для некоторых URL-адресов он выполняется очень хорошо, но для некоторых Я получаю ошибку, как это. И это показывает некоторую ошибку в HTMLParser.java: строка номер 102. Это строка номер 102 в HTMLParser.java

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

Я также предоставил код HTMLParse.

org.apache.tika.exception.TikaException: TIKA-198: Illegal IOException from org.apache.tika.parser.microsoft.ooxml.OOXMLParser@67c28a6a
        at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:203)
        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:102)
        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)
Caused by: java.util.zip.ZipException: invalid block type
        at java.util.zip.InflaterInputStream.read(Unknown Source)
        at java.util.zip.ZipInputStream.read(Unknown Source)
        at java.io.FilterInputStream.read(Unknown Source)
        at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:114)
        at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:55)
        at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:82)
        at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:220)
        at org.apache.poi.extractor.ExtractorFactory.createExtractor(ExtractorFactory.java:152)
        at org.apache.tika.parser.microsoft.ooxml.OOXMLExtractorFactory.parse(OOXMLExtractorFactory.java:65)
        at org.apache.tika.parser.microsoft.ooxml.OOXMLParser.parse(OOXMLParser.java:67)
        at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197)
        ... 8 more

Это мой файл 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();
            String utfHtmlContent = new String(htmlContent.getBytes(),"UTF-8");
            htmlStream = new ByteArrayInputStream(utfHtmlContent.getBytes());
    //The below line is at the line number 102 according to error above
                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 голос
/ 13 сентября 2016

У меня была та же проблема, я обнаружил, что файлы документов (docx), которые я пытался проанализировать, на самом деле не были простыми документами, они были разработаны в формате Microsoft Word с полями текста и ввода рядом с текстом метки.Я удалил такие файлы из папки и разместил остальные файлы на движке Solr для разбора и индексации. Это сработало.

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

Похоже на искаженный документ OOXML (.docx, .xlsx и т. Д.). Чтобы проверить, возникает ли проблема с последней версией Tika, вы можете загрузить jar-приложение tika и запустить его так:

java -jar tika-app-1.0.jar --text http://url.of.the/troublesome/document.docx

Это должно распечатать текст, содержащийся в документе. Если это не сработает, пожалуйста, отправьте отчет об ошибке с URL-адресом проблемного документа (или приложите документ, если он не является общедоступным).

...