[英]HTML parsing Android Jsoup
我对android有点陌生,我试图使用jsoup解析html页面以从页面中收集一些信息。 我想使用称为loadwebsite的方法通过弹出窗口(altertbox)插入网址:
private void loadWebsite(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Inserisci url sito");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
linkurl = input.getText().toString();
//linkurl="https://"+linkurl;
url123.setText("https://"+linkurl.toString());
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
和一个名为getsiteinfo()的方法
private void getinfoWebsite(){
new Thread(new Runnable() {
@Override
public void run() {
final StringBuilder builder = new StringBuilder();
try {
Document doc = Jsoup.connect(linkurl).get();
String title = doc.title();
Element image = doc.select("img").first();
String imgSrc = image.absUrl("src");
InputStream in = new java.net.URL(imgSrc).openStream();
bitmap = BitmapFactory.decodeStream(in);
builder.append(title).append("\n");
} catch (IOException e){
builder.append("Error :").append(e.getMessage()).append("\n");
}
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText(builder.toString());
}
});
}
}).start();
}
问题是,当我尝试通过文本框传递网址时,出现该错误:
03-26 17:22:16.826 26651-26840/it.uninsubria.pdm.htmlparsingjsoup E/AndroidRuntime: FATAL EXCEPTION: Thread-8
Process: it.uninsubria.pdm.htmlparsingjsoup, PID: 26651
java.lang.IllegalArgumentException: Must supply a valid URL
at org.jsoup.helper.Validate.notEmpty(Validate.java:102)
at org.jsoup.helper.HttpConnection.url(HttpConnection.java:72)
at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:36)
at org.jsoup.Jsoup.connect(Jsoup.java:73)
at it.uninsubria.pdm.htmlparsingjsoup.MainActivity$3.run(MainActivity.java:78)
at java.lang.Thread.run(Thread.java:764)
这是完整的代码:
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Tag;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
private Button getBtn;
private TextView result;
private ImageView img;
private Bitmap bitmap;
private Button button2;
private String linkurl = "";
private TextView url123;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
result = (TextView) findViewById(R.id.result);
img= (ImageView) findViewById(R.id.image2);
url123 =(TextView)findViewById(R.id.url123);
getBtn =(Button) findViewById(R.id.button2); //
getBtn.setOnClickListener(new View.OnClickListener() { // Pulsante "open website
@Override //
public void onClick(View v) {
openWebsite();
}
});
getBtn =(Button) findViewById(R.id.getBtn);
getBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadWebsite();
getinfoWebsite();
img.setImageBitmap(bitmap);
}
});
}
//////////////////////////////////////////// -------------------METHODS------------------////////////////////////////////////////////
private void getinfoWebsite(){
new Thread(new Runnable() {
@Override
public void run() {
final StringBuilder builder = new StringBuilder();
try {
Document doc = Jsoup.connect(linkurl).get();
String title = doc.title();
Element image = doc.select("img").first();
String imgSrc = image.absUrl("src");
InputStream in = new java.net.URL(imgSrc).openStream();
bitmap = BitmapFactory.decodeStream(in);
builder.append(title).append("\n");
} catch (IOException e){
builder.append("Error :").append(e.getMessage()).append("\n");
}
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText(builder.toString());
}
});
}
}).start();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void openWebsite(){
Uri uriUrl = Uri.parse(String.valueOf(linkurl));
Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
startActivity(launchBrowser);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//pop-up text per caricare link url
private void loadWebsite(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Inserisci url sito");
final EditText input = new EditText(this);
input.setInputType(InputType.TYPE_CLASS_TEXT);
builder.setView(input);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
linkurl = input.getText().toString();
//linkurl="https://"+linkurl;
url123.setText("https://"+linkurl.toString());
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
}
该错误表明您传递给Jsoup.connect的参数无效(空)。 好像您在创建onClick侦听器以设置linkurl
值linkurl
,但是您正在立即开始解析线程,即,不等待设置linkurl
值。 例如,您可以通过在getinfoWebsite()中的run方法的开头插入以下代码来延迟执行代码: while(linkurl.isEmpty()) { Thread.sleep(1000);}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.