Android'de Jsoup kütüphanesi kullanımı ve Html Parse etme işlemi

Merhabalar,


Bu yazıda Android'de Jsoup kütüphanesi kullanımını ve bir web sitesi üzerindeki Html'i Parse etme işlemini anlatacağım. Jsoup bir Java kütüphanesi olduğu için bu işlemi Java diliyle gerçekleştirmek daha uygun olacaktır. Ancak elbette ki isterseniz Kotlin ile de bu işlemi gerçekleştirebilirsiniz.


Örnek projede Bursa'daki nöbetçi eczaneleri ekranda göstereceğiz. Bu projeyi Github üzerinden paylaştım. İndirip inceleyebilirsiniz.


Örnek proje linki


İlk olarak build.gradle dosyasını açıp gerekli kütüphaneleri projeye ekliyoruz ve Sync'e basıyoruz. Ben Jsoup'un yanı sıra, tasarım kısmında CardView kullanmak istediğim için CardView kütüphanesini de ekledim:

implementation 'org.jsoup:jsoup:1.10.3'
implementation 'com.android.support:cardview-v7:28.0.0'


activity_main.xml dosyasını açıp tüm ekranı kaplayacak şekilde bir ListView yerleştiriyoruz:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lvPharmacy"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>


ListView'de bulunan her bir elemanı (item) temsil etmesi için item_pharmacy.xml adında bir layout dosyası oluşturuyoruz. Eczanenin adını, adresini ve telefonunu göstereceğiz. Adres ve telefon kısmı için kullanmış olduğum ikonları Github reposundan bulabilirsiniz.


item_pharmacy.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top"
    android:orientation="horizontal">

    <android.support.v7.widget.CardView
        card_view:cardCornerRadius="0dp"
        card_view:cardUseCompatPadding="true"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="5dp">

            <TextView
                android:id="@+id/tvPharmacyName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#e74c3c" />

            <TextView
                android:id="@+id/tvPharmacyAddress"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/ic_location"
                android:gravity="center_vertical"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="#000" />

            <TextView
                android:id="@+id/tvPharmacyPhone"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@drawable/ic_call"
                android:gravity="center_vertical"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textColor="#000" />

        </LinearLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>


Veri modelimizi belirtmek adına model dosyamızı oluşturuyoruz.


PharmacyModel.java:

package com.yusufborucu.htmlparsesample;

public class PharmacyModel {
    private String name;
    private String address;
    private String phone;

    public PharmacyModel(String name, String address, String phone) {
        this.name = name;
        this.address = address;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return name + address + phone;
    }
}


Gelen verileri işleyerek ekrandaki ListView nesnesinde göstermek adına adapter dosyamızı oluşturuyoruz.

PharmacyAdapter.java:

package com.yusufborucu.htmlparsesample;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class PharmacyAdapter extends BaseAdapter {

    private Context context;
    private List<PharmacyModel> rowItems;

    public PharmacyAdapter(Context context, List<PharmacyModel> items) {
        this.context = context;
        this.rowItems = items;
    }

    private class ViewHolder {
        TextView txtName;
        TextView txtAddress;
        TextView txtPhone;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_pharmacy, null);
            holder = new ViewHolder();
            holder.txtName = convertView.findViewById(R.id.tvPharmacyName);
            holder.txtAddress = convertView.findViewById(R.id.tvPharmacyAddress);
            holder.txtPhone = convertView.findViewById(R.id.tvPharmacyPhone);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final PharmacyModel rowItem = (PharmacyModel) getItem(position);

        holder.txtName.setText(rowItem.getName());
        holder.txtAddress.setText(rowItem.getAddress());
        holder.txtPhone.setText(rowItem.getPhone());

        return convertView;
    }

    @Override
    public int getCount() {
        return rowItems.size();
    }

    @Override
    public Object getItem(int position) {
        return rowItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return rowItems.indexOf(getItem(position));
    }
}


Yararlanacağımız web sitesi url'si: https://www.nobetcieczanebul.com/bursa-nobetci-eczane

Eczane verilerinin bulunduğu Html içeriği:

<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
    <div class="panel panel-default ecz">
        <div class="panel-heading" style="background-color:#E0E3D6;">Alagöz Eczanesi - <strong>Nilüfer</strong></div>
        <div class="panel-body">Çamlıca Mah. Kavakdere Cad. No:150/B-B (Çamlıca Asm Karşısı) Nilüfer/Bursa <b>© (18:30-08:30&nbsp;) Açık</b>
            <br>
            <br>Tel : 0 224 453 55 75&nbsp;&nbsp;&nbsp;&nbsp;<a href="/bursa/469/Nilüfer/Alagöz-Eczanesi" target="_blank"><strong style="color:#2554C7;">HARiTA</strong></a>
      	</div>
    </div>
</div>


Gördüğünüz üzere her bir eczane verisi "col-sm-6" class'ı bulunan div'lerin içinde verilmiş. Eczanenin adı "panel-heading", adres ve telefon bilgileri ise "panel-body" içerisinde mevcut. Ufak bir hesaplama, substring ve indexOf kullanımı ile verilere kolayca ulaşabiliriz.


Şimdi artık asıl işleme geçelim. Bir web sitesi üzerinden Html Parse işlemi yapacağımız için bu işlemi arkaplanda yürütmek ve bu sırada kullanıcıya bilgi vermek en sağlıklı yöntem olacaktır. Bu yüzden AsyncTask ve ProgressDialog kullanacağız. PharmacyTask.java adında bir dosya oluşturup içeriğini şu şekilde dolduruyoruz:

package com.yusufborucu.htmlparsesample;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class PharmacyTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog pd;
    private Context context;
    private List<PharmacyModel> pharmacyItems;
    public static String pharmacy;

    public PharmacyTask(Context context) {
        this.context = context;
        pharmacyItems = new ArrayList<>();
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pd = new ProgressDialog(context);
        pd.setMessage("Lütfen bekleyiniz...");
        pd.setIndeterminate(false);
        pd.setCancelable(false);
        pd.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        String address, phone;
        Document doc;
        String url = "https://www.nobetcieczanebul.com/bursa-nobetci-eczane";

        try {
            pharmacyItems.remove(pharmacyItems);
            doc = Jsoup.connect(url).ignoreContentType(true).get();
            for (Element row : doc.select("div.col")) {
                Elements header = row.select("div.card-header");
                Elements body = row.select("div.card-body");
                address = body.text().substring(0, body.text().indexOf("©"));
                phone = body.text().substring(body.text().indexOf("Tel :") + 6, body.text().indexOf("Tel :") + 21);
                PharmacyModel item = new PharmacyModel(header.text(), address, phone);
                pharmacyItems.add(item);
                pharmacy = header.text();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        pd.dismiss();
        PharmacyAdapter adapter = new PharmacyAdapter(context, pharmacyItems);
        MainActivity.lvPharmacy.setAdapter(adapter);
    }

}

Burada şu işlemleri yaptık:

  • onPreExecute fonksiyonunda ProgressDialog nesnesini hazırlayıp çalıştırdık. Böylece kullanıcıya "Lütfen bekleyiniz..." mesajı vermiş olduk.
  • doInBackground fonksiyonunda ilgili web sitesinin içeriğini alıp Jsoup kütüphanesi yardımıyla Html Parse işleminden geçirdik. Elde ettiğimiz verileri önceden belirtmiş olduğumuz veri modeli şeklinde listemize aktardık.
  • onPostExecute fonksiyonunda ProgressDialog nesnesini durdurduk ve önceden belirtmiş olduğumuz adapter aracılığıyla verilerimizi ekrana bastırdık.


Son olarak MainActivity.java dosyamızın onCreate fonksiyonunda, oluşturmuş olduğumuz AsyncTask'ı çalıştırıyoruz:

package com.yusufborucu.htmlparsesample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    public static ListView lvPharmacy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lvPharmacy = findViewById(R.id.lvPharmacy);

        new PharmacyTask(this).execute();
    }
}


Tabii ki AndroidManifest.xml dosyamızı açıp internet iznini vermeyi de unutmuyoruz :)

<uses-permission android:name="android.permission.INTERNET"/>


Uygulamamızın ekran görüntüsü şu şekilde olacaktır:


İyi çalışmalar.

Yusuf Borucu

Yazılımı iş ve hobi olarak yapan bir insan evladıyım. Yazılıma yönelik uğraştığım ve ilgi duyduğum teknolojiler; Laravel, Android (Kotlin & Java), Vue.js ve Node.js. Her geçen gün kendimi geliştirmeye gayret gösteriyorum....

"Android'de Jsoup kütüphanesi kullanımı ve Html Parse etme işlemi" için 24 yorum yapıldı.
H.Ö
hasan özdemir 07 Nisan 2020

<div id="sinavTabloCon"> <div class="tarih-table"> <table id="tbl_surec"> <thead> <tr class="tarih-table-header"> <th style="min-width: 14em;"><dfn><ins>TERCİH ADI</ins></dfn></th> <th style="width: 5em;"><dfn><ins>ÜCRET</ins></dfn></th> <th><dfn><ins> BAŞVURU TARİHLERİ </ins></dfn></th> <th style="min-width: 11em;"><dfn><ins>DURUMU</ins></dfn></th> </tr> </thead> <tbody> <tr data-surecid="8903"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> KPSS-2020/5 Tercih </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>20 TL</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>26.03.2020 10:00-<br>01.04.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> <tr data-surecid="8901"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> 2020 - TUS 1. Dönem Tercihi </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>-</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>25.03.2020 10:35-<br>31.03.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> <tr data-surecid="8797"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> 2019 - YDUS Tercih </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>-</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>05.03.2020 15:45-<br>12.03.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> <tr data-surecid="8731"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> KPSS-2020/4 Tercih </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>20 TL</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>14.02.2020 10:00-<br>20.02.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> <tr data-surecid="8608"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> 2019 - DUS Ek Tercih </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>20TL</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>10.01.2020 10:00-<br>16.01.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> <tr data-surecid="8602"> <td class="surec-td"><dfn style="height: 35px; line-height: 30px;"><ins> KPSS-2020/3 Tercih </ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>20 TL</ins></dfn></td> <td><dfn style="height: 35px; line-height: 30px;"><ins>08.01.2020 10:00-<br>15.01.2020 23:59</ins></dfn></td> <td class=" surec-bitti "><dfn style="height: 35px; line-height: 30px;"><ins> Bitti </ins></dfn></td> </tr> </tbody> </table> <div class="sinav-surec-aciklama" data-surecid="8903"><h3>KPSS-2020/5: Sağlık Bakanlığı Sözleşmeli Pozisyonlarına Yerleştirme - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>26.03.2020 10:00</span></div><div><label>Bitiş Tarihi :</label><span>01.04.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>20 TL</span></div><div><label>Ödeme Yerleri:</label><span>Akbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Albaraka Türk Katılım Bankasının tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Finansbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Kuveyt Türk Katılım Bankası’nın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Halkbank ATM, internet bankacılığı ve şubeler; ING Bank’ın tüm şubeleri ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Vakıf Katılım Bankası’nın tüm şubeleri ve ATM (KKTC’den başvuracak adaylar hariç); Ziraat Bankası sadece internet bankacılığı ve mobil bankacılık (Şubelerden ve ATM’den ücret yatırılmaz.); ÖSYM Kartlı Ödeme Sistemi (https://odeme.osym.gov.tr/)</span></div></section></div><div class="sinav-surec-aciklama" data-surecid="8901"><h3>2020 TUS 1. Dönem Yerleştirme - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>25.03.2020 10:35</span></div><div><label>Bitiş Tarihi :</label><span>31.03.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>-</span></div></section></div><div class="sinav-surec-aciklama" data-surecid="8797"><h3>2019 - YDUS Yerleştirme - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>05.03.2020 15:45</span></div><div><label>Bitiş Tarihi :</label><span>12.03.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>-</span></div></section></div><div class="sinav-surec-aciklama" data-surecid="8731"><h3>KPSS-2020/4: Sağlık Bakanlığı Sözleşmeli Pozisyonlarına Yerleştirme - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>14.02.2020 10:00</span></div><div><label>Bitiş Tarihi :</label><span>20.02.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>20 TL</span></div><div><label>Ödeme Yerleri:</label><span>Akbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Albaraka Türk Katılım Bankasının tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Finansbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Kuveyt Türk Katılım Bankası’nın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Halkbank ATM, internet bankacılığı ve şubeler; ING Bank’ın tüm şubeleri ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Vakıf Katılım Bankası’nın tüm şubeleri ve ATM (KKTC’den başvuracak adaylar hariç); Ziraat Bankası sadece internet bankacılığı ve mobil bankacılık (Şubelerden ve ATM’den ücret yatırılmaz.); ÖSYM Kartlı Ödeme Sistemi (https://odeme.osym.gov.tr/)</span></div></section></div><div class="sinav-surec-aciklama" data-surecid="8608"><h3>2019 DUS Ek Yerleştirme - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>10.01.2020 10:00</span></div><div><label>Bitiş Tarihi :</label><span>16.01.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>20TL</span></div><div><label>Ödeme Yerleri:</label><span>Kartlı Ödeme Sistemi (https://odeme.osym.gov.tr/)</span></div></section></div><div class="sinav-surec-aciklama" data-surecid="8602"><h3>KPSS-2020/3: Çevre ve Şehircilik Bakanlığı Tapu Ve Kadastro Genel Müdürlüğü - TERCİH</h3><section class="surec-aciklama"></section><section class="surec-bilgi"><div><label>Başlangıç Tarihi :</label><span>08.01.2020 10:00</span></div><div><label>Bitiş Tarihi :</label><span>15.01.2020 23:59</span></div><div><label>Tercih Ücreti:</label><span>20 TL</span></div><div><label>Ödeme Yerleri:</label><span>Akbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Finansbank’ın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Kuveyt Türk Katılım Bankası’nın tüm şubeleri, ATM ve internet bankacılığı (KKTC’den başvuracak adaylar hariç); Halkbank ATM, internet bankacılığı ve şubeler; Ziraat Bankası sadece internet bankacılığı ve mobil bankacılık (Şubelerden ve ATM’den ücret yatırılmaz.); ÖSYM Kartlı Ödeme Sistemi (https://odeme.osym.gov.tr/)</span></div></section></div> </div> </div> bu tablodaki verileri çekecek for döngüsü nasıl oluyor yardım edebilir misiniz

Yusuf Borucu (Yazı sahibi)09 Nisan 2020

Merhaba, Öncelikle yazdığınız kodu formatlayıp link olarak paylaşırsanız okunup yorumlanması açısından daha kolay olacaktır. Formatlamak için https://htmlformatter.com/ sitesini, link olarak paylaşmak için de https://codeshare.io/ sitesini kullanabilirsiniz. Örneğin yoruma yazmış olduğunuz kodu ben formatlayıp link olarak paylaştım; https://codeshare.io/21zlKm Sorunuza gelecek olursam, bu yazmış olduğum makaledeki projenin PharmacyTask.java dosyasının doInBackground fonksiyonunu şu şekilde düzenleyerek istediğiniz verilere ulaşacak for döngüsünü elde edebilirsiniz: https://codeshare.io/Gk9EyM (Ben test etmek için Log'a bastırdım.) İyi çalışmalar.

U.C
Umut Can ARDA 17 Nisan 2020

Çok teşekkür ederim çok faydalı bir yazı olmuş.

U.C
Umut Can ARDA 17 Nisan 2020

Çok teşekkür ederim çok faydalı bir yazı olmuş.

U.C
Umut Can Arda 17 Nisan 2020

Mehaba tekrardan acaba doInBackground içerisinde html parçalama işlemini kısaca mantığını anlatır mısınız anladım ancak div.card-header diye bir yer bulamadım html içerisinde ama java dosyamıza ekliyoruz

Yusuf Borucu (Yazı sahibi)17 Nisan 2020

Merhaba, öncelikle yorumunuz için teşekkür ederim. Html parçalama işlemi yaptığımız https://www.nobetcieczanebul.com/bursa-nobetci-eczane linkinin sayfa kaynağına bakacak olursak, eczanelerle ilgili bilgiler "col" class'ına sahip div'lerin içinde bulunuyor. Bu yüzden for döngüsünde "div.col" diyerek o verileri çeviriyoruz. For döngüsüne girdiğimizde de her bir elemanın içinde "card-header", "card-body" şeklinde class'lara sahip div'ler var. "card-header" eczanenin adının ve ilçesinin bulunduğu class. Örneğin; <div class="card-header text-left p-0 pl-1">Ada Eczanesi - <Strong>Nilüfer</Strong></div> Sayfa kaynağına bakarken bu kısım gözünüzden kaçmış olabilir. Ancak ben sorunuzu yanlış da anlamış olabilirim. Tekrar bakıp geri dönüş yaparsanız yine yardımcı olmaya çalışırım. İyi çalışmalar.

U.C
Umut can arda 17 Nisan 2020

Merhaba hocam ya aslında takıldığım soru şu. 1 sorum var. 1. Çekmek istediğim sitede bir div var "asd" diyrlim ve bunun için içinde td taglarının içinde 3 veri var tablo yani.<td><strong>Veri1</strong></td> bunun gibi 3 veri var diyelim bunu nasıl çekeceğim ki sadece tek class içerisinde plduğu için çözüm bulamadım bilgisizliğimi afgörün.

Yusuf Borucu (Yazı sahibi)17 Nisan 2020

Merhaba tekrardan, estağfurullah öyle bilgisizlik gibi düşünmeyin, yazılım dünyasında hepimizin belki günlerce uğraşıp çözemediği sorunlar olmuştur ve olmaya da devam edecektir mutlaka. Veriyi çekmek istediğiniz siteyi paylaşırsanız, sayfa kaynağına bakıp daha kolay yardımcı olabilirim. Buradan paylaşmak istemezseniz bana mail adresimden de ulaşabilirsiniz: [email protected]

U.C
Umut Can Arda 17 Nisan 2020

Tabi paylaşayım hocam bir de sadece tek bir veri çekmeye çalışıyorum. Document doc = Jsoup.connect("https://www.gezginler.net/").get(); Element eloElement = doc.getElementsByClass("div.ui-tabs > h1").first(); String elo = eloElement.text(); user.setName(elo); tarzında kullanmak istedim sadece tek bir veriyi textview üzerinde göstermek istiyorum textView2 = (TextView) findViewById(R.id.textView); Vericek wc = new Vericek(); wc.vericek(ilanno); textView2.setText(wc.user.getName()); mainactivity im de böyle ancak sürekli her siteden boş veri geliyor neden acaba yanlış mı kullandım. bu arada tablo olan siteden çekmeye çalıştığım site ve kod bloğu: https://faceitelo.net/player/FlySquare0 class name table-responsive(3 tane aynı isimle class var ben 1.kinden bahsediyorum)

Yusuf Borucu (Yazı sahibi)17 Nisan 2020

İlk kısımda yazdığınız linkte (https://www.gezginler.net/) sayfa kaynağında CTRL + F ile arattım ancak "ui-tabs" class'ına sahip bir div bulamadım. Belki de class adını yanlış belirtiyorsunuzdur. Diğer linkteki (https://faceitelo.net/player/FlySquare0) ilk tablodan verileri çekmek için şu şekilde bir işlem yapabilirsiniz: https://codeshare.io/2jlOBg

U.C
Umut Can Arda 17 Nisan 2020

Hocam yanlış yaptığım birley yok hata da almıyorum ama sizin kodlarınız veya kendi kodum farketmeksizin veriler sürekli boş dönüyor

Yusuf Borucu (Yazı sahibi)17 Nisan 2020

O halde sorun farklı yerlerde. Ben bu linkte (https://codeshare.io/2jlOBg) belirttiğim şekilde bir kod yazarak Log üzerinde verilere ulaşabiliyorum. İsterseniz projenizdeki activity, adapter, asynctask, model vs. dosyalarını codeshare.io sitesi üzerinden paylaşıp link atın, inceleyip yardımcı olmaya çalışayım.

U.C
Umut Can Arda 18 Nisan 2020

Hocam gece gece size yük olmak istemem. Ben sabaha kadar uğralayım olmadı sabah yardım isterim. Çok teşekkürler

U.C
Umut Can Arda 18 Nisan 2020

Hocam log üzerinde görüntülemeyi başardım ama doInBackground üzerinde setText yapamıyorum mainactivity dosyamı gönderdim amacım elo2 değişkenini setText ettirmek: https://codeshare.io/amy3Vk

U.C
Umut Can Arda 18 Nisan 2020

Bulamayan arkadaşlar için ui eklemeyi aşağıya ekliyorum kendim yaptım. protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); runOnUiThread(new Runnable() { @Override public void run() { textView.setText(elo);//ui ekleyeceğiniz elementler } }); dialog.dismiss(); }

U.C
Umut Can Arda 18 Nisan 2020

Hocam günaydın ben her şeyi halletim tüm sorunlarımı buldum ve çözdüm ancak hiçbir yerde cevap bulamadığım tek ve son sorum var. bu kodları HomeFragment içerisinde kullanıyorum hata vermiyorum ama app kendini durdurup crash veriyor. Yardım ederseniz sevinirim

Yusuf Borucu (Yazı sahibi)18 Nisan 2020

Günaydın, güzel gelişmeler bunlar tebrik ederim. HomeFragment dosyanızı ve fragment'i çağırdığınız activity dosyanızı codeshare üzerinden gönderebilir misiniz?

U.C
Umut Can Arda 18 Nisan 2020

Hocam homefragment dosyam burada: https://codeshare.io/2KR78N

Yusuf Borucu (Yazı sahibi)19 Nisan 2020

Fragment dosyasını inceledim, bir sorun yok gibi görünüyor. Bu durumda projenin bütününü incelemek gerekir. İsterseniz projenizi Github üzerinden paylaşın bir de o şekilde inceleyeyim.

U.C
Umut Can Arda 20 Nisan 2020

Hocam tüm destekleriniz için çok teşekkür ederim her sorunumu hallettim hiçbir hata almıyorum kod doğru ben yanlış yerleştirmişim sanırım. Teşekkürler

Yusuf Borucu (Yazı sahibi)20 Nisan 2020

Rica ederim, yardımcı olabildiysem ne mutlu bana. İyi çalışmalar.

E
Emre 03 Mayıs 2020

Merhaba, bu adreste aşağıya doğru A.. ile başlayan bir sözlük var, sadece sözlük kısmını okuma için nasıl bir AsyncTask kullanmak gerekir, yardımcı olabilirseniz çok memnun oluruz, adres:https://umutrehberi.com/2020/04/29/dervis-dilinden/

U.C
Umut Can Arda 03 Mayıs 2020

Emre tüm hepsini alıp substr ile parçalayıp kullanabilirsin diye düşünüyorum linke substr kullanımını bıraktım : https://www.codeproject.com/Questions/1223127/How-to-use-substring-in-android-studio

E
Emre 03 Mayıs 2020

Teşekkürler, konu ile çok alakalı olmasa da parçalamayı kullanıyorum ancak bir string içerisinde aşağıdaki gibi bir durumla da karşılaştım bu durumda nasıl bir çözüm üretilebilir? String yazi=bu bir yazı "Emre" birinci isim "Umut" ikinci, burada üçüncü bir isim tırnak içinde olabilir "Can" ... yukarıdaki örnekte emre ve umut isimleri bir arraylistesine nasıl aktarılabilir

Yorum yap * E-posta adresiniz yayınlanmayacak.