Извлечение элемента веб-страницы с помощью Jsoup в AsyncTask во фрагменте (новичок Android)

#java #android #android-fragments #android-asynctask #jsoup

#java #Android #android-фрагменты #android-asynctask #jsoup

Вопрос:

Я новичок в Java и Android, поэтому мне нужна ваша помощь. Я внедрил JSoup в своем приложении, чтобы извлекать это с веб-страницы и показывать в textview (я работаю во фрагменте, но я думаю, что это то же самое, что и стандартное действие в данном случае).

 <body marginwidth="0" marginheight="0">
<h1></h1>
<p class="testoprezzo">0.5516 </p>
</body>
  

Я должен взять только 0,5516

Я понятия не имею, как это сделать. Вы можете мне помочь? Это код, который я уже написал:

 class fetcher extends AsyncTask<Void,Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {

        try {

            String value = "https://mywebpage.net/";
            Document document = Jsoup.connect(value).followRedirects(false).timeout(30000).get();
            Element p= document.select ("p.testoprezzo").first();
            ((Globals)getApplication()).setValore(p.text());




        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);


        TextView valore = findViewById(R.id.textView4);
        valore.setText(((Globals)getApplication()).getValore());








    }
}
  

Заранее благодарю вас!

Ответ №1:

Постарайтесь использовать максимально ограничивающий селектор, чтобы не получить нерелевантных результатов. В вашем случае вы должны использовать —

 Element e = doc.select("p.testoprezzo").first();
String result = p.text();
  

Ответ №2:

Используйте элементы, чтобы получить тег p.

 class fetcher extends AsyncTask<Void,Void, Void> {
String txtValue;

@Override
protected Void doInBackground(Void... arg0) {

    try {

        String value = "https://mywebpage.net/";
        Document document = Jsoup.connect(value).followRedirects(false).timeout(30000).get();
        Element p= document.select ("p.testoprezzo").first();
        txtValue = p.text();




    } catch (Exception e) {
        // TODO Auto-generated catch block
        txtValue = null;
        e.printStackTrace();
    }

    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);


    TextView valore = findViewById(R.id.textView4);
    valore.setText(txtValue);
}
  

}

Пожалуйста, обратите внимание, что Элементы и элемент разные. Используйте их в соответствии с вашими потребностями. Вот список всех селекторов вместе с примером.

Также обратите внимание: НЕ ВНОСИТЕ НИКАКИХ ИЗМЕНЕНИЙ в UI в doInBackground методе, иначе вы получите сообщение об ошибке.

Комментарии:

1. Я пробовал, но Android Studio не разрешает метод «select» в элементе p = document.select(«p»).first();

2. убедитесь, что вы импортируете что-то подобное этому import org.jsoup.nodes.Document; в разделе импорта, а не другие.. в зависимости от вашего проекта доступно 3-4 типа документов.

3. И последний вопрос, как перенести значение результирующей строки в textview? Я попробовал postExecute, но, похоже, работает по-другому во фрагменте

4. Объявите глобальную строковую переменную и doInBackground присвоите это значение p вашей строковой переменной, затем в onPostExecute методе напишите эту строку yourTextView.setText(your_string_variable_name);

5. Хм … по некоторым причинам это не работает, но я не могу понять, почему, приложение запускается, но текст не выводится