خواندن صفحات 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 نمی اره