質問

私はウェブページをrawっていて、そのウェブページからすべてのリンクを抽出した後、以下のコードを使用してApache TikaとvoilerPipeを使用してすべてのURLを解析しようとしているので、URLの一部については非常によく解析されますが、私は少数の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;
                }   
            }               
        }
    }
}
役に立ちましたか?

解決

変更してみてください

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

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

これはハックかもしれませんし、最終的なソリューションとして使用したくないかもしれませんが、この変更後に機能し始めた場合、入力は元々UTF-8ではなかったことがわかります。

他のヒント

例外は、FeedParserクラスからのものです。これは、解析しようとしているリソースがHTMLドキュメントではなくRSSまたはAtomフィードであることを示しています。

例外に基づいて、UTF-8であると宣言する奇形のフィードを扱っている可能性が高い( <?xml version="1.0" encoding="UTF-8"?> prefix)、しかし、その後、他の非UTF-8エンコードにコンテンツが含まれます。 XMLの過激な解析規則を考えると、このフィードは解析できないため、受け取ったTikaexceptionは予想通りです。

問題の詳細については、あなたが指摘することをお勧めします フィードバリレーター 面倒なURLに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top