0

htmlページをパースして有益な情報を選択して表示するプログラムを作りたいと思っています。ストリームを開き、この適切なコンテンツを 1 行ずつ検索することでこれを行いましたが、これは時間のかかるプロセスです。そこで、それを xml として扱い、xpath を使用することにしました。これは、システムでxmlファイルを作成し、ストリームからコンテンツをロードすることで行いましたが、空白エラーが発生したため、次のようにドキュメントを開くことにしました

doc = (Document) builder.parse(inputStream);

しかし、同じエラーが引き続き発生します。ここで尋ねた後、html 解析に jSoup を使用するように提案されました。コードを実行すると、次のようになります。

Document doc= Jsoup.connect(url).get();

読み取りタイムアウトが発生します。Pythonで同じプログラムを作成し、文字列のfindメソッドを使用して検索するなどの単純な戦略を使用すると、内容が表示されて速すぎます。Javaで高速に動作させるには?

完全なコード:

import java.io.*;
import org.jsoup.Jsoup;
import org.jsoup.helper.Validate;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Parser {
public static void main(String[] args) {
    Validate.isTrue(true, "usage: supply url to fetch");
    try{
        String url="http://www.spoj.com/ranks/PRIME1/";
        Document doc= Jsoup.connect(url).get();
        Elements es=doc.getElementsByAttributeValue("class","lightrow");
        System.out.println(es.get(0).child(0).text());


    }catch(Exception e){e.printStackTrace();}
}

}

例外:

java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:412)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:393)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:159)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:148)
at Parser.main(Parser.java:12)
4

1 に答える 1

1

ファイアウォールまたはOSがリクエストをブロックしますか(インターネットへのJavaアクセスをブロックする可能性があります)?PCを使用していますか?アンドロイド?また、HTMLページはWebサイトですか、それとも(ローカル)HTMLファイルですか。さらにコードまたは発生した例外を投稿してください。

DOMドキュメントは使用しないでくださいorg.jsoup.nodes.Document

内容が表示されます

コンテンツをどのように表示しますか?単に次のような値が必要な場合:

...
<div>some value</div>
...

あなたはjsoupでこれを行うことができます:

Document doc = ... // parse html file or connect to website

final String value = doc.select("div").first().text();

System.out.println(value);

編集:

デフォルトの接続タイムアウトは3秒(3000ミリ秒)であるため、データの読み込みに時間がかかる場合があるため、大きなWebサイトでは変更する必要があります。

final String url = "http://www.spoj.com/ranks/PRIME1/";
final int timeout = 4000; // or higher

Document doc = Jsoup.connect(url).timeout(4000).get();
于 2013-01-04T18:53:36.947 に答える