繁体   English   中英

HTML解析Android Jsoup

[英]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侦听器以设置linkurllinkurl ,但是您正在立即开始解析线程,即,不等待设置linkurl值。 例如,您可以通过在getinfoWebsite()中的run方法的开头插入以下代码来延迟执行代码: while(linkurl.isEmpty()) { Thread.sleep(1000);}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM