我想制作一个程序来解析html页面并选择有用的信息并显示它。我通过打开一个流,然后逐行搜索适当的内容来做到这一点,但这是一个耗时的过程。所以我决定通过将其视为 xml 然后使用 xpath 来做到这一点。我通过在系统上创建一个 xml 文件并从流中加载内容来完成此操作,但出现空格错误,然后我决定直接打开文档
doc = (Document) builder.parse(inputStream);
但同样的错误仍然存在。在这里询问后,有人建议我使用 jSoup 进行 html 解析,现在当我执行代码时:
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();}
}
}
异常(exception):
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)
最佳答案
您的防火墙或操作系统是否阻止您的请求(也许它阻止 java 访问互联网)?您使用的是 PC 还是例如。安卓?您的 HTML 页面是网站还是(本地)HTML 文件? 请发布更多代码或您遇到的异常。
请确保您不使用 DOM 文档,而是使用 org.jsoup.nodes.Document
。
I am displayed the contents
您想如何显示内容?如果您只需要这样的值:
...
<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();
关于java - jsoup超时,xml出现空格错误,基本遍历页面很耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14155062/