我有关于Jsoup库的问题......
我有这个小程序,它下载,解析并获取HTML页面的标题google.com
。
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class HTMLParser{
public static void main(String args[]) {
// JSoup Example - Reading HTML page from URL
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Jsoup Can read HTML page from URL, title : "+title);
}
}
该计划运作良好,但问题是:
当我尝试解析ip地址192.168.1.1
中的文件时(我将google.com
更改为192.168.1.1
,这是路由器的地址):
doc = Jsoup.connect("http://192.168.1.1/").get();
它不起作用并向我显示以下错误:
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=401, URL=http://192.168.1.1/
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:537)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:493)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:194)
at HTMLParser.main(HTMLParser.java:43)
首先我认为问题与" ussername和密码"有关。所以我将地址192.168.1.1
更改为Username:Password@192.168.1.1
:
doc = Jsoup.connect("http://username:password@192.168.1.1/").get();
但它不起作用,程序将整行读作地址。
如果有人有任何想法请帮助我!并感谢大家
答案 0 :(得分:0)
与saka1029一样,您可以通过身份验证请求URL。然后使用Jsoup.parse(String)
获取Document
对象。
或者您只是使用Jsoup方法发送请求并获得响应:
Getting HTML Source using Jsoup of a password protected website
Jsoup connection with basic access authentication
(我通常使用javax.xml.bind.DatatypeConverter.printBase64Binary
进行Base64转换。)
答案 1 :(得分:0)
非常感谢saka1029; Griddoor。我读了你的建议,非常有帮助,
对我来说,我使用这个解决方案:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.store:
if(visible){
if(!storeVisible){
Log.e("MSG", "If !storeVisible called");
if(settingsVisible){
setViewGone(settingsLayout);
settingsVisible = false;
setViewVisible(storeLayout);
storeVisible = true;
Log.e("MSG", "If !storeVisible and settingsVisible called");
return;
} else {
setViewVisible(storeLayout);
storeVisible = true;
Log.e("MSG", "If !storeVisible and else called");
return;
}
} else if (storeVisible) {
settingsLayout.setVisibility(View.GONE);
setViewGone(storeLayout);
storeVisible = false;
Log.e("MSG", "else if storeVisible called");
return;
}
} else {
store.setClickable(false);
Log.e("MSG", "else clickable called");
}
break;
case R.id.settings:
if(visible){
if(!settingsVisible){
Log.e("MSG", "If !settingsVisible called");
if(storeVisible){
setViewGone(storeLayout);
storeVisible = false;
setViewVisible(settingsLayout);
settingsVisible = true;
Log.e("MSG", "If !settingsVisible and storeVisible called");
return;
} else {
setViewVisible(settingsLayout);
settingsVisible = true;
Log.e("MSG", "If !settingsVisible and else called");
return;
}
} else if (settingsVisible) {
storeLayout.setVisibility(View.GONE);
setViewGone(settingsLayout);
settingsVisible = false;
Log.e("MSG", "else if settingsVisible called");
return;
}
} else {
settings.setClickable(false);
Log.e("MSG", "else clickable called");
}
break;
}
}
public void setViewVisible(View view){
view.setVisibility(View.VISIBLE);
view.startAnimation(expandTop);
}
public void setViewGone(View view){
view.setVisibility(View.GONE);
view.startAnimation(retractTop);
}
来自:Connecting to remote URL which requires authentication using Java
并使用此方法阅读URL url = new URL("http://user:pass@domain.com/url");
URLConnection urlConnection = url.openConnection();
if (url.getUserInfo() != null) {
String basicAuth = "Basic " + new String(new Base64().encode (url.getUserInfo().getBytes()));
urlConnection.setRequestProperty("Authorization", basicAuth);
}
InputStream inputStream = urlConnection.getInputStream();
:
inputstream
来自:Read/convert an InputStream to a String
然后我用Jsoup解析StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer);
String theString = writer.toString();
。