jsoup超时,xml获取空白错误,基本遍历页面是耗时的

时间:2013-01-04 10:11:21

标签: java parsing html-parsing jsoup

我想创建一个解析html页面并选择有用信息并显示它的程序。我通过打开一个流然后逐行搜索这个适当的内容来做到这一点,但这是一个耗时的过程。所以我决定将它作为xml处理,然后使用xpath。我通过在我的系统上制作一个xml文件并从流中加载内容来做到这一点,并且我得到了空格错误,然后我决定直接打开文档

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

但同样的错误仍然存​​在。在询问这里后,我建议使用jSoup进行html解析,现在当我执行我的代码时:

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

我读取超时。在python中使用相同的程序并使用像使用字符串和搜索的查找方法这样的天真策略,我显示的内容太快了。如何让它在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)

1 个答案:

答案 0 :(得分:1)

您的防火墙或操作系统是否会阻止您的请求(可能会阻止Java访问互联网)?您使用PC还是例如。 Android的?您的HTML页面是网站还是(本地)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毫安),因此应对大型网站进行更改,因为加载数据可能需要一些时间:

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

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