1

私はウェブサイトからの情報を解析しようとしています。ただし、コンテキストがそれほど長くない場合にのみ機能します。HTMLが大きくなると、読み込まれるコンテンツは不完全になります。取得される文字列の全長は約40000です。毎回取得される文字列の数は異なります。(例:これは、初めて31345カウント、次回は31358カウントのようなものです)したがって、ページ全体を取得できません。

結果として、この問題はインターネット接続またはバッファに関連している可能性があると思います。しかし、私はbufferedReaderを使用しました。私が知る限り、HttpURLConnectionはストリームのように機能するので、問題はないはずです。UrlConnectionに関連するほとんどすべてのページを確認しましたが、これについて話す人は誰もいません。

私のコードに何か問題がありますか?私はこの問題に数日間取り組んできました。どんなアドバイスも非常に役に立ちます。前もって感謝します。

public String getHtmlFromUrl(String url, int startReadingLine) {
    String xml = "";

    try {

        //URL url1 = new URL(url);
        URL url1 = new URL("http://support.google.com/analytics/bin/answer.py?hl=zh-Hant&answer=1009602");

        HttpURLConnection urlConn = (HttpURLConnection) url1
                .openConnection();

        urlConn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1;zh-tw; MSIE 6.0)");
        if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
            System.setProperty("http.keepAlive", "false");
        }
        urlConn.setReadTimeout(10000 /* milliseconds */);
        urlConn.setConnectTimeout(15000 /* milliseconds */);
        urlConn.setDoOutput(true);
        urlConn.setDoInput(true);
        urlConn.setRequestMethod("GET");
        urlConn.setUseCaches(false);


        InputStreamReader in = new InputStreamReader(
                urlConn.getInputStream());
        BufferedReader buffer = new BufferedReader(in, 100000);

        StringBuilder builder = new StringBuilder();
        String auxaux = "";



        while ((aux = buffer.readLine()) != null)
            builder.append(aux);

        xml = builder.toString();

        in.close();
        urlConn.disconnect();

    } catch (SocketTimeoutException e) {
        return "time out";
    } catch (IOException e) {
        e.printStackTrace();
    }
    // return XML
    return xml;
}

xmlの例を次に示します:(40710としてカウント)

(xmlの最後に「...」を追加しませんでした)

<!DOCTYPE html><html lang="zh-Hant"class="streamlined streamlined-3"><head><script type="text/javascript">serverResponseTimeDelta=window.external&&window.external.pageT?window.external.pageT:-1;pageStartTime=new Date().getTime...

   ...

 ..."納米比亞", "NR": "諾魯", "NP": "尼泊爾", "NL": "荷蘭", "AN": "荷屬安地列斯", "KN": "尼維斯", "NC": "新喀里多尼亞", "NI": "尼加拉瓜", "NE": "尼日", "NG": "奈及利亞", "NU": "紐埃", "KR": "北韓", "NO": "挪威", "NZ": "紐西蘭", "OM": "阿曼", "PW": "帛琉", "PK": "巴基斯坦", "PS": "巴勒斯坦", "PA": "巴拿馬", "PG": "巴布亞新幾內亞", "PY": "巴拉圭", "PE": "秘魯", "PH"...

別の:(カウント41106)

<!DOCTYPE html><html lang="zh-Hant"class="streamlined streamlined-3"><head><script type="text/javascript">serverResponseTimeDelta=window.external&&window.external.pageT?window.externa...

    ...

...屬安地列斯", "KN": "尼維斯", "NC": "新喀里多尼亞", "NI": "尼加拉瓜", "NE": "尼日", "NG": "奈及利亞", "NU": "紐埃", "KR": "北韓", "NO": "挪威", "NZ": "紐西蘭", "OM": "阿曼", "PW": "帛琉", "PK": "巴基斯坦", "PS": "巴勒斯坦", "PA": "巴拿馬", "PG": "巴布亞新幾內亞", "PY": "巴拉圭", "PE": "秘魯", "PH"...

編集:これまでのところ、各結果のカウントが異なるため、インターネットとの対話方法に関係があると思います。または、デバイスの奇妙なバグである可能性があります。根本的な原因はまだわかっていません。最も奇妙な部分は、結果が「...」で終わることです。結果がまだ完全ではないことを知っているようです...

4

2 に答える 2

1

常に入力を外部ファイルに書き込んで、実際に受け取るものを確認してください。私もAndroidで同じ問題を抱えていました。結局、logcatは文字列全体を表示しませんでした!

于 2013-05-10T08:27:01.540 に答える
0

以下のコードを試すことができます。

BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while(result != -1) {
  byte b = (byte)result;
  buf.write(b);
  result = bis.read();
}        
return buf.toString();

そうでなければ:

       Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(
                    new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        return writer.toString();

私が現在使用している最後の方法は次のとおりです。

    URL u=null;
    InputStream is = null;
    DataInputStream dis;
    StringBuffer outData = new StringBuffer();
    try {
        u = new URL(url);
        is = u.openStream();
        dis = new DataInputStream(new BufferedInputStream(is));
        String app = null;
        while ((app = dis.readLine()) != null) {
            outData = outData.append(app);
        }
    } catch (MalformedURLException ex) {
        Log.e(TAG, "Malformed URL Exception", ex);
        return null;
    } catch (IOException ex) {
        Log.e(TAG, "Error stream ", ex);
        return null;
    } finally {
        try {
            is.close();
        } catch (IOException ioe) {
        }
    }
    return outData.toString();
于 2013-01-22T10:35:27.987 に答える