2011-11-30 5 views
0

웹 페이지를 크롤링하고 크롤링 한 다음 해당 웹 페이지의 모든 링크를 추출한 다음 Apache Tika 및 BoilerPipe를 사용하여 모든 URL을 구문 분석하려고합니다. 아주 잘 파싱하지만, 어떤 사람들은 이렇게 오류가납니다. 그리고 그것은 HTMLParser.java에 대한 몇 가지 오류를 보여줍니다 행 번호 (102)이 내가 또한 HTMLParse 코드를 제공 한 Apache Tika에서 HTML 문제 분석하기

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

HTMLParser.java

에 줄 번호 (102)이다.
org.apache.tika.exception.TikaException: TIKA-198: Illegal IOException from [email protected] 
     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; 
        } 
       }    
      } 
     } 
    } 

입니다.

+0

문제가 무엇인지 잘 모르겠지만 디버거를 실행하고 htmlContent를 검사하거나 적어도 로그하면 문제를 쉽게 디버깅 할 수 있다고 생각합니다. 이것은 콘텐츠에 이상이 있는지 여부에 대한 단서를 제공 할 수 있습니다. –

+0

tika 버전의 일부 문제 ?? 위의 경우 Apache Tika 0.9를 사용하고 poi3.7에 따라 다릅니다. 그래서 org.apache.poi에 문제가 있다고 가정하고 있습니다. [http://comments.gmane.org/gmane.comp.apache.tika.user/543](http://comments.gmane.org/gmane). comp.apache.tika.user/543) – ferhan

+0

그리고 tika 버전을 0.9에서 1.0으로 업그레이드했을 때 나는 이와 같이 다른 오류가 나기 시작했습니다. org.apache.tika.exception.TikaException : TIKA-198 : org.apache.tika.parser.pkg.PackageParser에서 IOException이 잘못됨 @ 4fd30479' – ferhan

답변

1

잘못된 OOXML 문서 (.docx, .xlsx 등)와 유사합니다. 문제가 계속 최신 티카 버전의 발생 여부를 확인하려면 티카 - 응용 프로그램 항아리 download과 같이 실행할 수 있습니다 :이 문서에 포함 된 텍스트를 인쇄해야

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

. 작동하지 않는 경우 bug report에 문제가있는 문서의 URL을 첨부하거나 공개적으로 사용할 수없는 경우 첨부하십시오.

1

동일한 문제가 있었는데 구문 분석하려고하는 문서 (docx) 파일이 실제로 간단한 문서가 아니라는 것을 알았습니다.이 양식은 텍스트가있는 Microsoft Word와 레이블 텍스트 옆에 입력 필드로 개발되었습니다.

폴더에서 이러한 파일을 제거하고 모든 파일의 나머지 부분을 분석 및 인덱싱을 위해 Solr 엔진에 게시했습니다.

+0

docx 파일의 "TotalTime"메타 데이터를 구문 분석 할 때 문제가 있음을 발견했습니다. 메타 데이터 문제 다음과 같은 오류가 발생했습니다 : 스레드 "main"의 예외 org.apache.tika.exception.TikaException : OOXML 추출기를 만드는 중 오류가 발생했습니다. org.apache.tika.parser.microsoft.ooxml.OOXMLExtractorFactory.parse OOXMLExtractorFactory.java:120) at. . . . at org.apache.tika.cli.TikaCLI.main (TikaCLI.java:145) 에 의해 발생 : org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException : 유효하지 않은 int 값 : 4294966778 – JPatel