خواندن صفحات Html در اندرویدبا استفاده از JSoup

منتشرشده توسط حامد قنبری در تاریخ

دراین پست قصد داریم نحوه استفاده از JSoup به منظور تجزیه و تحلیل صفحات  HTML را در Android توضیح دهیم.. JSoup یکی از کتابخانه  های جاوا است که به ما کمک می کند تا فایل HTML را از آدرس مشخصی استخراج و دستکاری کنیم. با استفاده از این کتابخانه ما به راحتی خواهیم توانست به پارامترهای اساسی صفحات  HTML در Android دسترسی پیدا کنیم.

در برخی شرایط نیاز پیدا می کنیم که صفحات یک سایت را  تجزیه و اطلاعات مورد نیاز خود را از آن استخراج  و به جای برخی از اطلاعات ، اطلاعات دیگری را جایگزین کنیم. در این مورد کتابخانه  JSoup یکی از بهترین انتخاب هاست چرا که  دارای مجموعه ای از API قدرتمند است که امکان استخراج و دستکاری داده ها، با استفاده از بهترین روش های DOM، CSS و جی کوئری را فراهم می کند. در این پست ما درباره نحوه استفاده از این کتابخانه و همچنین نحوه استخراج برخی از اطلاعات از آن را  در یک پروژه Android و  برای شما آموزش خواهیم داد

 

تجزیه HTML در آندروید: مقدمه JSoup

چندین روش برای خواندن و تجزیه یک صفحه HTML وجود دارد. در این مورد ما  قصد داریم آن را از یک سرور از راه دور بازیابی کنیم و اگر می خواهیم این صفحه را به عنوان DOM تجزیه کنیم باید در اولین قدم URL را تعریف کنیم. :

 

Document doc  = Jsoup.connect(URL).get();

doc یک نمونه از کلاس Document است که سند بازیابی شده را نگه می دارد. اکنون سند  را ما در اختیار داریم می توانیم اطلاعات را از آن استخراج کنیم. ما می توانیم عنوان یا سایر اطلاعات را با استفاده از تگ های HTML بازیابی کنیم.

برای مثال اگر بخواهیم همه برچسب ها  را به نام meta بدست آوریم، باید:

Elements metaElems = doc.select("meta");

از این روش زمانی استفاده می شود که ما بخواهیم برچسب ها را با استفاده از CSS-query پیدا کنیم. به عنوان مثال، اگر ما می خواهیم ارزش تابع را از یک تگ بازیابی کنیم:

String name = metaElem.attr("name");

علاوه بر این، ما می توانیم تمام عناصر را در یک صفحه HTML انتخاب کنیم که دارای یک مقدار خاص کلاس CSS هستند. به عنوان مثال در این وبسایت، برخی از عناصر دارای کلاس CSS وجود دارد، بنابراین ما باید:

Elements topicList = doc.select("h2.topic");

مثال

اولین چیزی که باید انجام دهیم ایجاد یک پروژه استاندارد اندروید است که شامل یک اکتیویتی ساده است. فرض کنید شما از Android Studio برای انجام این کار استفاده می کنید. هنگامی که پروژه شما آماده است، باید وابستگی JSoup را اضافه کنیم. از این رو فایل file build.gradle را باز کنید و در بخش وابستگی کد زیر را به آن اضافه اضافه کنید:

 

 

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.android.support:support-vector-drawable:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'org.jsoup:jsoup:1.8.3'
    compile 'org.jsoup:jsoup:1.10.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
}

به منظور درک بهتر موضوع ابتدا مثالی برای دوستان عزیز ارایه می کنیم :

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml  زیر را به آن اضافه کنید:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray">

    <TextView
        android:id="@+id/titletxt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="@android:color/transparent" />

    <Button
        android:id="@+id/titlebutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="گرفتن عنوان و اطلاعات سایت"
        android:layout_marginTop="153dp"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

 

سپس به سراغ کلاس اصلی پروژه رفته و کدهای زیر را به آن می افزاییم

package psrd.ir.example.Jsoup;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

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

import java.io.IOException;

public class MainActivity extends Activity {

    // URL Address
    String url = "http://www.psrd.ir";
    ProgressDialog mProgressDialog;
    private String info;

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

        // تعریف عناصر لایوت xml
        Button titlesite = (Button) findViewById(R.id.titlebutton);


        // کلیک بر روی باتن
        titlesite.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                // Execute Title AsyncTask
                new VerifyInfoSite().execute();
            }
        });


    }

    // Title AsyncTask
    private class VerifyInfoSite extends AsyncTask<Void, Void, Void> {
        String title;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //نشان دادن progressDialog
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle(" در حال دریافت اطلاعات");
            mProgressDialog.setMessage("در حال بارگیری");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                // اتصال به سایت با کلاس Jsoup
                Document document = Jsoup.connect(url).get();
                // گرفتن عنوان سایت از صفحه html سایت
                title = document.title();
                
                // گرفتن المنت مربوط به مت یا توضیحات سایت
                Elements description = document
                        .select("meta[name=description]");
                // Locate the content attribute
                info = description.attr("content");

            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // نشان دادن اطلاعات در تکست ویو
            TextView showTitle = (TextView) findViewById(R.id.titletxt);
            showTitle.setText(title+info);
            // پایان نمایش progressDialog
            mProgressDialog.dismiss();
        }
    }


}

در نهایت فایل Androidmanefest.xml  را باز نموده و مجوز مربوط به اتصال به اینترنت را که در کدهای زیر به رنگ قرمز مشخص شده است به آن می افزاییم:

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="psrd.ir.example.Jsoup">


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


    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
    </application>

</manifest>

حال می توانید پروژه خود را اجرا کرده و نتیجه کار خود را ببینید.


3 دیدگاه

جعفر · ژانویه 1, 2018 در 2:05 ب.ظ

توضیح بیشتر با مثالهای ساده تر
اموزش شما را جذاب میکند

    حامد قنبری · ژانویه 1, 2018 در 2:23 ب.ظ

    حتماً .

sepehr · جولای 28, 2018 در 11:01 ق.ظ

سلام
من تا قسمت تعریف element می رم ولی موقعی که کد doc.select می خوام بزنم برای من اپشنی به عنوان select نمی اره

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --