2

私はWebページをクロールしており、クロールした後、そのWebページからすべてのリンクを抽出し、以下のコードを使用してApache TikaとBoilerPipeを使用してすべてのURLを解析しようとしています.次のエラー。このエラーの意味がわかりません。コードに問題があるのか​​、それとも 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;
                }   
            }               
        }
    }
}
4

2 に答える 2

1

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

例外に基づいて、UTF-8(<?xml version="1.0" encoding="UTF-8"?>プレフィックス付き)であると宣言しているが、他の非UTF-8エンコーディングのコンテンツを含む不正な形式のフィードを処理している可能性があります。XMLの厳格な解析ルールを考えると、このフィードは解析できないため、受け取るTikaExceptionは期待どおりです。

問題の詳細については、フィードバリデーターに厄介なURLを指定することをお勧めします。

于 2011-11-30T08:38:19.260 に答える
1

変更してみる

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

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

これはハックである可能性があり、最終的な解決策として使用したくない場合がありますが、この変更後に機能し始めた場合、入力が元々 UTF-8 ではなかったことがわかります。

于 2011-11-30T00:42:52.647 に答える