بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

آموزش استفاده از کتابخانه Jsoup

مدیریت گفتگو
Criss 10 سال پیش
آخرین تغییر: 5 سال پیش

jsoup HTML parser library

این کتابخانه برای پارس کردن صفحات HTML بکار میره <

شما میتونید با وارد شدن به یک صفحه HTML هر مقدار String درون اون رو بیرون بکشید <

همچنین بجای والی و رتروفیت میتونید ازش در ارتباط با وب سرویس استفاده کنید ، خیلی ساده و راحت هست کار باهاش 

برای بهتر متوجه شدن کارایی این کتابخانه < در پست بعد ، دنبال کنید <

نظرات

nmotaghed 10 سال پیش
میشه بگین این لایبری تو 3 به پایینم جواب میده یا نه؟
Hadi 8 سال پیش
ممنونم کریس جان از آموزش فوق العادت. قابل توجه دوستان: این لایبرری در این لحظه (1397/3/4) آخرین ورژن اش 1.11.3 است و برای اضافه کردن اش به پروژه اندروید استودیو عبارت 'compile 'org.jsoup1.11.3 رو تو build.gradle قرار بدید و build کنید.
Hadi 8 سال پیش
'compile 'org.jsoup:1.11.3

پاسخ‌ها 14

Criss 10 سال پیش

سلام دوستان

امروز وقت کردم و Jsoup رو یاد گرفتم ، از اون چیزی که فکرش رو میکردم ، خیلی راحتتر بود !

1- ابتدا core library را از این لینک دانلود کنید ممکنه در آینده ورژن جدیدتری بیاد ، فعلا jsoup-1.8.3.jar هست

اون رو درون فولدر Libs قرار بدید و Build کنید <

در AndroidManifest هم Permission مربوط به Internet رو قرار بدید <

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

حالا سعی میکنیم هر قسمتی از سایت رو که بخوایم بکشیم بیرون < روی Cloob.com تست میکنیم

با fireFox به ادرس cloob.com برید و Ctrl+U رو بزنید توی خط 10 باید این رو ببینید <

 <title>شبکه اجتماعی کلوب</title>

 برای نمایش مقدار بالا در Log کافیه کد زیر رو استفاده کنید <

  try {
Document doc = Jsoup.connect("http://www.cloob.com/").get();
Log.i("JSOUP_0", doc.title());
}
catch (IOException e) {
e.printStackTrace();
}

 حالا سعی میکنیم مقادیر دلخواه رو بیرون بکشیم برای اینکار شما باید Elements ها و Attribute ها خوب بشناسید که البته کار سختی نیست < برای مثال در تصویر زیر کادرهای آبی رنگ Elements هستند و کاردهای قرمز رنگ Attribute که در نهایت با وصل شدن به Elements و گرفتن Attribute مورد نظر < مقدار درون اونهارو بصورت String خارج میکنیم <

برای مثال در خط 5 برای گرفتن مقدار درون name و content به این صورت عمل میکنیم

 Elements metaElems = doc.select("meta");
String name = metaElems.attr("name");
String name0 = metaElems.attr("content");

خب شاید براتون سوال بشه که خط 17 رو چطور میشه دریافت کرد ؟ با اینکه Elements و Attribute مشابه خط 5 رو داره

برای اینکار بصورت زیر عمل میکنیم <

 Elements metaElems2 = doc.select("meta[name=verify-v1]");
String name2 = metaElems2.attr("content");

شما برای خط 5 هم میتونستید مقدار رو کامل قرار بدید < یعنی

Elements metaElems3 = doc.select("meta[name=\"apple-mobile-web-app-capable\"]");
String name3 = metaElems3.attr("name");
String name30 = metaElems3.attr("content");

مثال برای خط 8 هم میتونه به این صورت باشه

 Elements metaElems4 = doc.select("link[id]");
String name4 = metaElems4.attr("href");

خب دیگه تمام مثال های مختلف برای وصل شدن به Elements و گرفتن Attribute رو زدم < تنها میمونه یک مثال دیگه

به خط 644 در سورس دقت کنید :

644 <div class="loginAuth_signup clearfix">
            	<a href="http://www.cloob.com/profile/register/step1" title="" class=""rel="nofollow">ثبت نام</a>        	</div>        
</div>

برای گرفتن مقدار درونی باید به صورت زیر عمل کرد < (فکر کردم مشکلی با وصل شدن به Elements نداشته باشید اما برای گرفتن مقدار "ثبت نام" Attribute ندارید !)

Elements metaElems5 = doc.select("div[class=\"loginAuth_signup clearfix\"]");
String name5 = metaElems5.text();

یک مثال از کافه بازار بزنیم < برای گرفتن VersionName

 Document doc2 = Jsoup.connect("https://cafebazaar.ir/app/YOURPAKAGE/?l=fa").get();
Elements metaElems_2 = doc2.select("div[itemprop=\"softwareVersion\"]");
String name_2 = metaElems_2.text();
Log.i("JSOUP_0", doc2.title());
Log.i("JSOUP_1", name_2);

 

نظرات

محسن علیزاده 10 سال پیش
عاااااااااالی بود داداش، ساده، رون و کاربردی...
MiLAD 10 سال پیش
ممنونم از آموزش خوب و البته کاربردی
nmotaghed 10 سال پیش
ممنون دوست عزیز از آموزش خوب و کاربردی شما
nmotaghed 10 سال پیش
ممنون دوست عزیز از آموزش خوب و کاربردی شما
nmotaghed 10 سال پیش
ممنون دوست عزیز از آموزش خوب و کاربردی شما
Android 10 سال پیش
فوق العاده بود.خیلی وقت بود این مسئله ذهنمو درگیر کرده بود.مرسی
nmotaghed 10 سال پیش

موقع اجرا برنامه کرش میکنه ممنون میشم بگین مشکل کجاست؟

نظرات

nmotaghed 10 سال پیش
هم لایبرری امپورت شده و هم دسترسی اینترنت .
nmotaghed 10 سال پیش
ممنونم دوست عزیز
Criss 10 سال پیش
برای قسمت هایی که درخواست ارتباط میدید کافیه توی یک ترد قرار بگیره و یا از Asyntask استفاده کنید
nmotaghed 10 سال پیش
بله درسته برنامه رو تو ترد گذاشتم درست شد.
nmotaghed 10 سال پیش
الان باز یه مشکل ( بخاطر عدم آشنایی با ترد) . چطور میتونم رشته گرفته شده درون ترد رو تو یک تکست ویو نمایش بدم؟
atf 10 سال پیش
باید از handler استفاده کنید
nmotaghed 10 سال پیش
ممنون میشم بیشتر راهنمایی کنید. یا مثالی بزنید.
RODER 10 سال پیش
باید از هندلر استفاده کنی سرچ کن هندلر رو در موردش مطلب زیاد هست .
atf 10 سال پیش

 
Thread thread = new Thread(new Runnable() {
    @Override
public void run() {
        handler.post(new Runnable() {
            @Override
public void run() {
                txt.setText("هر چی دوست داشتی");
}
        });
}
});
thread.start();

بفرمایید

 

 

 

 

نظرات

nmotaghed 10 سال پیش
لطف کردی دوست عزیز.
nmotaghed 10 سال پیش
لایبرری jsoup برای اندروید چند به بالا هستش؟
Criss 10 سال پیش
@nmotaghed : من سایت Jsoup.org رو گشتم چیزی از اینکه روی اندروید چند به بالا کار میکنه پیدا نکردم < میتونید وارد سایتشون بشید و این رو از ایمیل پشتیبانی سوال کنید
nmotaghed 10 سال پیش
مدت زمانی که طول میکشه تا هنگام کلیک بر روی یک ایتم(خبر) تا باز شدن اکتیویتی و نشون دادن متن رو چه جوری میشه فهمید ؟ منظورم گداشتن یک انیمیشن برای منتظر ماندن کاربر ...
atf 10 سال پیش
از AsyncTask استفاده کنید
nmotaghed 10 سال پیش
AsyncTask استفاده کردم برای نمایش اما مدت زمان رو چه جوری باید نشون بدم؟
atf 10 سال پیش
لازم نیست مدت زمان رو بدونید چون یک دفعه ممکن 10 ثانیه و دفعه ممکنه 30 ثانیه طول بکشه تا سرور به شما پاسخ بده شما در onPreExecute یک دیالوگ قرار بدید وقتی که اطلا عات دریافت شد و تموم شد در onPostExecute دیالوگ رو dismiss کنید
nmotaghed 10 سال پیش
خدا خیرت بده مشکلم برطرف شد. @atf
nmotaghed 10 سال پیش

دوستان توی پروژه ای از jsoup استفاده کردم. برنامه اجرا میکنه و هیچ مشکلی نداره بعد اینکه برنامه رو با keytool ازش خروجی میگیرم موقع اجرای اکتیویتی مربوط به jsoup خطا میده . ممنون میشم راهنمایی کنید .

نظرات

nmotaghed 10 سال پیش
با اضافه کردن این کد به proguard.cfg مشکل برطرف شد. -keep public class org.jsoup.** { public *; }
nmotaghed 10 سال پیش

-keep publicclass org.jsoup.**{
public*;}

نظرات

Android 10 سال پیش

دوستان گلم سلام.کسی میتونه بهم کمک کنه در خصوص کدهای زیر؟چطور میشه این متغیرهای هم نام رو که توی وب پیج به صورت مکرر تکرار شده اند رو مقدارهاشون رو گرفت؟البته چون این مقادیر بصورت آنلاین در حال تغییره و داینامیکه توی این کدهای وب پیج نمایش داده نشده اند.کسی پروژه یا طرح یا ایده ای در این خصوص داشته که بتونه کمکم کنه؟پیشاپیش از همکاریتون متشکرم

 <div class="PriceTable">
		<div id="arzlive">
			<table>
				<tbody>
					<tr>
						<th>سایر ارزها</th>
						<th>  آخرین نرخ  </th>
						<th>  تغییر لحظه ای   </th>
					</tr>
					<tr class="even">
						<td class="priceTitle"> دلار کانادا </td>
						<td class="priceValue" id="v3_44"></td>
						<td id="c3_44"></td>
					</tr>
					<tr class="odd">
						<td class="priceTitle"> یوان چین </td>
						<td class="priceValue" id="v3_45"></td>
						<td id="c3_45"></td>
					</tr>
					<tr class="even">
						<td class="priceTitle">  لیره ترکیه</td>
						<td class="priceValue" id="v3_46">  </td>
						<td id="c3_46"></td>
					</tr>
					<tr class="odd">
						<td class="priceTitle">  ین ژاپن</td>
						<td class="priceValue" id="v3_47"></td>
						<td id="c3_47"></td>
					</tr>
				</tbody>
			</table>
				
		</div>
	</div>

نظرات

Criss 10 سال پیش
شما ابتدا div class="PriceTable" رو درون یک Element قرار بدید البته دقت کنید که خروجی Element هست و یا Elements ، بعد از اون مقدار td class="priceTitle" دریافت کنید که دورن یک آرایه از Elements ها قرار میگیره ، حالا از Elements باید توی یک حلقه Element رو با استفاده از gettext خارج کنید , درون یک آرایه قرار بدید
Android 10 سال پیش
از راهنماییتون بسیار متشکرم
کوثر 10 سال پیش

 دوستان عزیز در مورد این تاپیک یه سوال پیش اومده واسم.اگه سایت قالبش عوض شه یا کلا تغییرات دیگه ای ایجاد شه توی اپ تغییری ایجاد میشه یا نه؟؟؟؟؟؟

نظرات

sun.of.god.7 10 سال پیش
اطلاعات از سورس html سایت گرفته میشه اگه تو attrbute ها و element هایی که شما ازش استفاده کردی تغییرات ایجاد شه برنامه به مشکل میخوره
konda 9 سال پیش

سلام
دوستان، چرا Jsoup از اندروید 4 به پایین پشتیبانی نمی کنه؟
وقتی می خوام یه اطلاعات از  html سایت بگیرم، این خطا میاد!! ولی فقط اندروید 5 به بالا راحت دریافت میشه.

 javax.net.ssl.SSLException: Connection closed by peer
     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406)
     at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
     at com.android.okhttp.Connection.connect(Connection.java:107)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
     at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
     at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
     at com.android.okhttp.internal.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:161)
     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:651)
     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:628)
     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:260)
     at org.jsoup.helper.HttpConnection.get(HttpConnection.java:249)

فقط به این کد گیر می داد

documentTone  =  Jsoup.connect(G.Url).get();

حتی این کد هم امتحان کردم، نشد.

documentTone  =  Jsoup.connect(G.Url).validateTLSCertificates(true).get();

نظرات

Criss 8 سال پیش
خب من امروز با این خطا مواجه شدم ، راه حلش رو زیر میذارم لینک
konda 9 سال پیش

دوستان، نوشتاری اشتباهی پیش اومده
منظورم بود که
حتی این کد هم امتحان کردم، نشد. باید می نوشتم (نشد) ، آخه در پست قبلی نوشتم (شد)، تا فکر نکنید که حل شده D:
 این کد هم امتحان کردم، بازم کار نکرد

documentTone  =  Jsoup.connect(G.Url).validateTLSCertificates(true).get();

نظرات

احسان 9 سال پیش

سلام دوستان 
من یه مشلی دارم با آدرس هایی که با کلمات فارسی ترکیب شدن ،مثلا : 

راز-سلامتی/http://tandorosti.com   وقتی همچین url هایی به jsoup  میدم درست کار نمی کنه!

چیکار باید کرد ؟ ممنون

----------------------------------------------- راه حل ----------------------------

اینطوری حل شد

  String placesUrl = String.format("http://www.test/fa/event-",
URLEncoder.encode("سالیانه","UTF-8"));

Document document =Jsoup.connect(placesUrl).get();

نظرات

Criss 8 سال پیش

حل مشکل خطا در اتصال به ssl

کلاس زیر رو ایجاد کنید

 
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;

/**
* Created by Javad on 2017-12-05 at 8:29 PM.
*/
public class SSLHelper {

public static void enableSSLSocket() throws KeyManagementException, NoSuchAlgorithmException {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});

SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new X509TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}

public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
}
}

بعدش بصورت زیر به سرور وصل بشید

 
private void connectToServer() {
new Thread(new Runnable() {
@Override
public void run() {
try {
SSLHelper.enableSSLSocket();
Connection.Response response = Jsoup
.connect("https://URL")
.method(Connection.Method.POST)
.data("KEY", "VALUE")
.validateTLSCertificates(true)
.followRedirects(true)
.execute();
Log.i("response", response.toString());
Log.i("response", response.headers().toString());
Log.i("response", response.body());

Document doc = response.parse();
String result = doc.body().text();

} catch (IOException e) {
e.printStackTrace();
G.toast("اختلال در ارتباط !");
} catch (java.security.NoSuchAlgorithmException | java.security.KeyManagementException e) {
e.printStackTrace();
}
}
}).start();
}

Jsoup SSl  SSLHandshakeException

نظرات

Criss 8 سال پیش

آپلود فایل با Jsoup ، این لایبری حرف نداره ، من نمیدونم چرا همه دست به دامن والی و رتروفیت Gson شدن !

 
new Thread(new Runnable() {
@Override
public void run() {
try {
Connection.Response response = Jsoup
.connect("URL")
.data("profile_avatar", file.getName(), new FileInputStream(file))
.method(Connection.Method.POST)
.validateTLSCertificates(true)
.timeout(5000).followRedirects(true)
.execute();

Document doc = response.parse();
String result = doc.body().text();
Log.e("result", result);

urlAvatar = "";

} catch (Exception e) {
e.printStackTrace();
}
}
}).start();

نظرات

StudioX 8 سال پیش

ممنون از آموزش جالب و بسیار کاربردی

من یه پله ازین آموزش بالاترش رو سوال دارم! چطوری میشه اطلاعات یه فرم رو با استفاده از آیدی فیلدهاش با استفاده از اپلیکیشن پر کرد و فرم رو ارسال کرد؟

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

نظرات

Criss 8 سال پیش
کافیه ببینید که اون فرم چه لینکی رو داره صدا میکنه و با چه کلید هایی دیتا رو ارسال میکنه شما میتونید همون لینک رو با همون کلید ها براش دیتا ارسال کنید
StudioX 8 سال پیش
مثلا من میخوام یوزر نیم پسورد رو وارد کنم و فرم رو ارسال کنم؛ تو صفحه بعدی که اسم کاربر رو میاره، اسم رو بگیرم و نشون بدم تو برنامه
mosi 8 سال پیش
سلام.. امکانش هست از طریق این کتابخونه ... تاریخ رو از اینترنت دریافت کرد؟
Criss 8 سال پیش
لینک بله شما میتونید تاریخ به متن از جایی بگیرید ولی ، این کار پیشنهاد نمیشه ، بهتره یه خط PHP بنویسید و با لایبری ابدیل تاریخ استاد اونو شمسی و یا میلادی در برنامه نمایش بدید
امید شریف مهر 5 سال پیش

یکی از بهترین های این انجمن 

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .