web-dev-qa-db-ja.com

ウェブサイトのコンテンツを文字列に読み込む

現在、私はurlで指定されたWebサイトのコンテンツを読み取るために使用できるクラスに取り組んでいます。私は_Java.io_と_Java.net_で冒険を始めたばかりなので、デザインについて相談する必要があります。

使用法:

_TextURL url = new TextURL(urlString);
String contents = url.read();
_

私のコード:

_package pl.maciejziarko.util;

import Java.io.*;
import Java.net.*;

public final class TextURL
{
    private static final int BUFFER_SIZE = 1024 * 10;
    private static final int ZERO = 0;
    private final byte[] dataBuffer = new byte[BUFFER_SIZE];
    private final URL urlObject;

    public TextURL(String urlString) throws MalformedURLException
    {
        this.urlObject = new URL(urlString);
    }

    public String read() 
    {
        final StringBuilder sb = new StringBuilder();

        try
        {
            final BufferedInputStream in =
                    new BufferedInputStream(urlObject.openStream());

            int bytesRead = ZERO;

            while ((bytesRead = in.read(dataBuffer, ZERO, BUFFER_SIZE)) >= ZERO)
            {
                sb.append(new String(dataBuffer, ZERO, bytesRead));
            }
        }
        catch (UnknownHostException e)
        {
            return null;
        }
        catch (IOException e)
        {
            return null;
        }

        return sb.toString();
    }

    //Usage:
    public static void main(String[] args)
    {
        try
        {
            TextURL url = new TextURL("http://www.flickr.com/explore/interesting/7days/");
            String contents = url.read();

            if (contents != null)
                System.out.println(contents);
            else
                System.out.println("ERROR!");
        }
        catch (MalformedURLException e)
        {
            System.out.println("Check you the url!");
        }
    }
}
_

私の質問は、私が望むものを達成するための良い方法ですか?より良い解決策はありますか?

特にsb.append(new String(dataBuffer, ZERO, bytesRead));は好きではありませんでしたが、別の方法で表現することができませんでした。反復ごとに新しい文字列を作成するのは良いことですか?いいえ。

他の弱点はありますか?

前もって感謝します!

16
Maciej Ziarko

代わりに URLConnection の使用を検討してください。さらに IOUtils from Apache Commons IO を利用して文字列を読みやすくすることもできます。例えば:

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();  // ** WRONG: should use "con.getContentType()" instead but it returns something like "text/html; charset=UTF-8" so this value must be parsed to extract the actual encoding
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

IOUtilsを使用したくない場合は、おそらく次のようにその行を書き直します。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8192];
int len = 0;
while ((len = in.read(buf)) != -1) {
    baos.write(buf, 0, len);
}
String body = new String(baos.toByteArray(), encoding);
19
WhiteFang34

HtmlParser のような専用ライブラリを使用することを強くお勧めします。

Parser parser = new Parser (url);
NodeList list = parser.parse (null);
System.out.println (list.toHtml ());

独自のhtmlパーサーを作成するのは、非常に時間がかかります。これが そのmaven依存関係 です。 its JavaDoc を見て、その機能を詳しく調べてください。

次のサンプルを見ると説得力があるはずです。

Parser parser = new Parser(url);
NodeList movies = parser.extractAllNodesThatMatch(
    new AndFilter(new TagNameFilter("div"),
    new HasAttributeFilter("class", "movie")));
6
yves amsellem

InputStreamInputStreamReaderでラップし、 それはread()メソッド を使用して文字データを直接読み取ることができます(あなたshouldReaderを作成するときにエンコードを指定しますが、任意のURLのエンコードを見つけることは簡単ではありません)。次に、単に sb.append() を呼び出したばかりのchar[](および正しいオフセットと長さ)を指定して呼び出します。

2
Joachim Sauer

これが、学習のためにコード化したい何らかのエクササイズでない限り...私はホイールを再発明せず、 HttpURLConnection を使用します。

HttpURLConnectionは、HTTPプロトコルを処理するための優れたカプセル化メカニズムを提供します。たとえば、コードがHTTPリダイレクトで機能しない場合は、HttpURLConnectionが修正します。

2

こんにちは、次のコード行を使用してください。

 <!DOCTYPE html>
    <html>
        <head>
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>

        </head>
        <body>
            <h1>Hello World!</h1> 






        URL uri= new URL("Your url");
        URLConnection ec = uri.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                ec.getInputStream(), "UTF-8"));
        String inputLine;
        StringBuilder a = new StringBuilder();
        while ((inputLine = in.readLine()) != null)
            a.append(inputLine);
        in.close();

        out.println(a.toString());   
0
FAISAL

これは古い質問であることはわかっていますが、他の人にも見つかるはずです。

追加の依存関係を気にしない場合、これは非常に簡単な方法です

Jsoup.connect("http://example.com/").get().toString()

Jsoup ライブラリが必要ですが、maven/gradleを使用してすばやく追加でき、ページのコンテンツを操作して特定のノードを見つけることもできます。

0
WallTearer