android 的 JSOUP 解析强制关闭

JSOUP parse for android force closes

我正在尝试使用 JSOUP 从网站 (http://hdh.ucsd.edu/mobile/dining/locationdetails.aspx?l=11) 获取菜单数据,但每当我尝试获取链接时,我的 android 应用程序就会崩溃。是什么原因?这是我的代码

public class SixthFragment extends Fragment {

String url = "http://hdh.ucsd.edu/mobile/dining/locationdetails.aspx?l=11";
ProgressDialog mProgressDialog;
String MENU;
String HOURS;
TextView textview;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_sixth, container, false);
    textview = (TextView) rootView.findViewById(R.id.textView10);

    new JSOUP().execute();
    return rootView;

}

public class JSOUP extends AsyncTask<Void, Void, Void>{
    ProgressDialog dialog;

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        dialog = new ProgressDialog(getActivity());
        dialog.setMessage("loading...");
        dialog.show();

    }

    @Override
    protected Void doInBackground(Void... params){
        try{

            Document document = Jsoup.connect(url).get();
            Elements elements = document.select("a[href]");
            //HOURS = elements.text();
            System.out.println(elements.size());
            for(int i = 0; i<elements.size(); i++){

                MENU += "\n" + elements.get(i).text();
                System.out.println(i);

            }

        }

        catch (Exception e){

        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result){
        dialog.dismiss();

        textview.setText(MENU);
        super.onPostExecute(result);
    }

}

}

我的错误显示如下

11-28 13:48:59.175 23230-23230/com.lamdevs.tritonbites E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lamdevs.tritonbites, PID: 23230
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.lamdevs.tritonbites.fragments.SixthFragment$JSOUP.onPostExecute(SixthFragment.java:82)
at com.lamdevs.tritonbites.fragments.SixthFragment$JSOUP.onPostExecute(SixthFragment.java:43)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我不明白,因为当我输出元素的大小时,元素的大小为 61。另外,有没有办法把早餐、午餐和晚餐分开吃?谢谢

查看您附加的错误日志..

java.lang.NullPointerException: Attempt to invoke virtual method 
'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.lamdevs.tritonbites.fragments.SixthFragment$JSOUP.onPostExecute(SixthFragment.java:82)

它在 SixthFragment 第 82 行中的 TextView 上讨论了 NullPointerException,即 textview.setText(MENU);

textview 已初始化 (textview = (TextView) rootView.findViewById(R.id.textView10);),看起来没问题。

因此,请确保您的布局 fragment_sixth 中有一个 ID 为 textView10TextView

请post你的布局XMLR.layout.fragment_sixth。可能您指的是错误的 ID,这会导致 de NullPointerException.


要分别获取每个 "Breakfast"、"Lunch" 和 "Dinner",您可以简单地遍历 HTML 元素内的最后三个 <div> 标记id MainContent_divDailySpecials(我通过 Chrome Developer Tools inspector 查看网站 DOM 结构时确实发现了那个 id)。

因此,作为开始,只需使用

获取该元素
Document document = Jsoup.connect(url).get();
Element parentDiv = document.getElementById("MainContent_divDailySpecials");

从那里开始,您可以向后迭代以获得 div 的最后三个 children。 (请记住,如果在任何时候该页面的结构发生变化,您的代码就会中断)。