Turkcell | Geleceği Yazanlar

GELECEĞİ YAZANLAR BLOG

Yeni Blog Yaz

Android'te JSOUP Parse İşlemleri

Ecem Bölük - 03 Ağustos 2016

Merhaba arkadaşlar, bugün sizlere JSOUP ile html taglarının parse işlemlerinden bahsedeceğim. Öncelikle jsoup kütüphenesini biraz inceleyelim. Projemize dahil ettiğimiz andan itibaren projemizden bir web sayfasını response edebiliriz ve geri dönen değerlerle çalışmalar veya bir web sayfasının içindeki bir veriyi alabiliriz. Jsoup web servis olmadığı bir web projesinde mobil veya başka projeden verilere erişmekte kullanabiliriz. Html taglarını parse ederken divlerin css attiributelerinden faydalanırız. Programımızda hangi divin içini alacaksak onun yolunu veriyoruz. Bu şekilde bilgilere daha kolay ulaşabiliyoruz. Jsoup kütüphanesinin dezavantajından bahsetmek gerekirse, html taglarını parse ettiğimiz sitenin taglar üzerinde değişiklik yapması durumunda uygulamamız doğru bir şekilde çalışmayacaktır.

Kütüphaneyi kısaca tanıdıktan sonra, uygulama üzerinde birazcık pekiştirelim. Uygulamamızda 3 buton ve bir textview bulunmakta. Butonlara bastığımızda "http://ecemboluk.blogspot.com.tr/" adresinden başlık, yazı açıklaması  ve yazarı bize getirecek. Tasarım kısmına geçmeden önce kütüphanemizi projeye dahil edip internet izinlerini alarak işe koyuyalım.

Projemizin build.grandle(Module:app) kısmına dependencies bölümüne kütüphanemizi compile ediyoruz.

compile 'org.jsoup:jsoup:1.9.2'

Daha sonra AndroidManifest.xml dosyasının içine internet izinlerimizi alıyoruz.

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

Daha sonra yukarıda tarif ettiğim gibi activity sayfasımızı tasarlıyoruz.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ecemboluk.jsoupuygulama.MainActivity">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Başlık"
        android:id="@+id/baslik"
        android:layout_marginTop="42dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Açıklama"
        android:id="@+id/aciklama"
        android:layout_alignBottom="@+id/baslik"
        android:layout_toRightOf="@+id/yazar"
        android:layout_toEndOf="@+id/yazar" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Yazar"
        android:id="@+id/yazar"
        android:layout_alignTop="@+id/baslik"
        android:layout_toRightOf="@+id/baslik"
        android:layout_toEndOf="@+id/baslik" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Jsoup Uygulama"
        android:id="@+id/textView2"
        android:layout_below="@+id/baslik"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="79dp" />


</RelativeLayout>

Şimdi de kod kısmına gelelim, kod üzerinde yorum satırlarıyla olayı anlatmaya çalışacağım ve sonunda çalışma sistemini anlatan kısa bir yazı ekleyeceğim.

    Button baslik;//Başlık butonu
    Button aciklama;//Açıklama butonu
    Button yazar;//Yazar butonu
    TextView text;//text butonu
    @Override
    protected void onCreate(Bundle savedInstanceState) {//Oncreat metodu ile nesnelerimizi oluşturduk ve classlarımızı çağırdık.
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=(TextView)findViewById(R.id.textView2);
        baslik=(Button)findViewById(R.id.baslik);
        baslik.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  new Baslik().execute();
            }
        });
        aciklama=(Button)findViewById(R.id.aciklama);
        aciklama.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  new Aciklama().execute();
            }
        });
        yazar=(Button) findViewById(R.id.yazar);
        yazar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 new Yazar().execute();
            }
        });
    }

Başlık için oluşturduğumuz sınıfı açıklayalım.

private class Baslik extends AsyncTask<Void,Void,Void>
    {
        String URL="http://ecemboluk.blogspot.com.tr";//site urlsi
        String baslik;
        ProgressDialog dialog;//dialog nesnesini tanımladık
        @Override
        protected  void onPreExecute()//Verilerin çekilme esnasında proggres dialog çalıştırır.
        {
            super.onPreExecute();
            dialog=new ProgressDialog(MainActivity.this);
            dialog.setTitle("Jsoup Uygulama.");
            dialog.setMessage("Veri getiriliyor");
            dialog.setIndeterminate(false);
            dialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {//Arka plan işlemleri gerçekleştirilir.
            try {
                Document doc= Jsoup.connect(URL).get();//Site ile bağlantı kurulur. Bu bağlantı doc nesnesine aktarılır.
                baslik=doc.title();// doc nesnesinden title metodu çağırılarak başlık çekilir.
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void avoid)//Arka plan işlemleri bittikten sonra başlık yazdırılır.
        {
            text.setText(baslik);
            dialog.dismiss();
        }
    }

Document sınıfı jsoup kütüphanesine aittir. Jsoup.connet metodu ile istenilen url'ye bağlanılır ve bilgiler document sınıfının oluşturulmuş nesnesine aktarılır. daha sonra title metodu çağırılarak sitedeki başlığı çekebilirsiniz. Bu sınıfı oluşturuken AsyncTask sınıfından kalıtım alıyoruz. AsyncTask sınıfı Java'daki Thread sınıfının Android SDK için tasarlanmış hali denilebilir daha fazla bilgiyi buradaki dersten elde edebilirsiniz.

Şimdi de açıklama için oluşturuğumuz sınıfı inceleyelim.

 private class Aciklama extends AsyncTask<Void,Void,Void>
    {
        String URL="http://ecemboluk.blogspot.com.tr/2015/06/c-ve-net-ortam-nedir-ne-degildir.html";
        String aciklama;
        String veri;
        ProgressDialog dialog;
        @Override
        protected  void onPreExecute()
        {
            super.onPreExecute();
            dialog=new ProgressDialog(MainActivity.this);
            dialog.setTitle("Jsoup Uygulama.");
            dialog.setMessage("Veri getiriliyor");
            dialog.setIndeterminate(false);
            dialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Document doc= Jsoup.connect(URL).get();//Siteye bağlantı sağlanıyor.
                Elements elements=doc.select("div[class=post-entry inside]");//div tagına ait attiribute çağrılıp Element sınfının içerisindeki nesneye aktarılıyor.
                elements.select("p");//elements nesnesi içindeki p tagları çağırılıyor.
                elements.select("img").remove();//elements nesnesi içindeki img tagları siliniyor.
                veri=elements.html();//istenilen html taglarını çeker.
                aciklama=Jsoup.parse(veri).text();//html taglarını texte çevirir.
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void avoid)
        {
            text.setText(aciklama);
            dialog.dismiss();
        }
    }

Öncelikle en başta yaptığımız gibi site ile bağlantı kuruyoruz. Daha sonra doc nesnesine aldığımız ilgileri biraz daha ayıklayıp elements nesnesine aktarıyoruz. Burada div etiketi içindeki istediğimiz attribute ile verileri alıyoruz. daha sonra elements nesnesinden p tagındaki verileri çağırıyoruz içindeki img tagındaki verileri siliyoruz. Bunları html metodu ile string veriye çevirip daha sonra jsoup.parse metodu ile text haline çevirip yazdırıyoruz.

Son olarakta yazar sınıfını inceleyelim.

private class Yazar extends AsyncTask<Void,Void,Void>
    {
        String URL="http://ecemboluk.blogspot.com.tr/2015/06/c-ve-net-ortam-nedir-ne-degildir.html";
        String yazar;
        String veri;
        ProgressDialog dialog;
        @Override
        protected  void onPreExecute()
        {
            super.onPreExecute();
            dialog=new ProgressDialog(MainActivity.this);
            dialog.setTitle("Jsoup Uygulama.");
            dialog.setMessage("Veri getiriliyor");
            dialog.setIndeterminate(false);
            dialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Document doc= Jsoup.connect(URL).get();
                Elements elements=doc.select("div[class=author-content]");
                elements.select("h5");
                veri=elements.html();//istenilen html taglarını çeker.
                yazar=Jsoup.parse(veri).text();//html taglarını texte çevirir.
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void avoid)
        {
            text.setText(yazar);
            dialog.dismiss();
        }
    }

Açıklama için yapılan işlemlerin benzerlerini de yazar sınıfı içinde yapıyoruz. Böylelikle işlemleri tanımlamış oluyoruz. Kodları daha ayrıntılı bir şekilde buradan elde edebilirsiniz.  Ayrıca JSOUP hakkında daha ayrıntılı bilgiyi buradan elde edebilirsiniz.

Tekrardan kolay gelsin. :)


 

4 Cevap

Sezgin Karagülle

21 Ağustos 2016

Çalışma için teşekkürler :) 

Furkan Baran

06 Eylül 2016

Çok yararlı Teşekkürler.

ozan

27 Aralık 2016

Eline sağlık 

kadir

12 Temmuz 2017

j soup ile kullaniciyorumlari.biz sitem için yorum çekebilirmiyim.

Yorum yapmak için Giriş Yapın ya da Üye olun.