آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

Criss  9 سال پیش  4 سال پیش
+55 0

jsoup HTML parser library

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

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

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

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

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

سلام دوستان

امروز وقت کردم و 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);

 

+4 0
عاااااااااالی بود داداش، ساده، رون و کاربردی... (9 سال پیش)
+1 0
ممنونم از آموزش خوب و البته کاربردی (8 سال پیش)
0 0
ممنون دوست عزیز از آموزش خوب و کاربردی شما (8 سال پیش)
0 0
ممنون دوست عزیز از آموزش خوب و کاربردی شما (8 سال پیش)
0 0
ممنون دوست عزیز از آموزش خوب و کاربردی شما (8 سال پیش)
+1 0
فوق العاده بود.خیلی وقت بود این مسئله ذهنمو درگیر کرده بود.مرسی (8 سال پیش)
پاسخ به سوال 
nmotaghed  8 سال پیش
0 0

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

0 0
هم لایبرری امپورت شده و هم دسترسی اینترنت . (8 سال پیش)
+1 0
لینک (8 سال پیش)
0 0
ممنونم دوست عزیز (8 سال پیش)
+4 0
برای قسمت هایی که درخواست ارتباط میدید کافیه توی یک ترد قرار بگیره و یا از Asyntask استفاده کنید (8 سال پیش)
0 0
بله درسته برنامه رو تو ترد گذاشتم درست شد. (8 سال پیش)
0 0
الان باز یه مشکل ( بخاطر عدم آشنایی با ترد) . چطور میتونم رشته گرفته شده درون ترد رو تو یک تکست ویو نمایش بدم؟ (8 سال پیش)
+1 0
باید از handler استفاده کنید (8 سال پیش)
0 0
ممنون میشم بیشتر راهنمایی کنید. یا مثالی بزنید. (8 سال پیش)
0 0
باید از هندلر استفاده کنی سرچ کن هندلر رو در موردش مطلب زیاد هست . (8 سال پیش)
پاسخ به سوال 
atf  8 سال پیش
+4 0

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

بفرمایید

 

 

 

 

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

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

0 0
با اضافه کردن این کد به proguard.cfg مشکل برطرف شد. -keep public class org.jsoup.** { public *; } (8 سال پیش)
پاسخ به سوال 
nmotaghed  8 سال پیش
+2 0

-keep publicclass org.jsoup.**{
public*;}
پاسخ به سوال 
Android  8 سال پیش
0 0

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

 <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>
+2 0
شما ابتدا div class="PriceTable" رو درون یک Element قرار بدید البته دقت کنید که خروجی Element هست و یا Elements ، بعد از اون مقدار td class="priceTitle" دریافت کنید که دورن یک آرایه از Elements ها قرار میگیره ، حالا از Elements باید توی یک حلقه Element رو با استفاده از gettext خارج کنید , درون یک آرایه قرار بدید (8 سال پیش)
+1 0
از راهنماییتون بسیار متشکرم (8 سال پیش)
پاسخ به سوال 
کوثر  8 سال پیش
0 0

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

+1 0
اطلاعات از سورس html سایت گرفته میشه اگه تو attrbute ها و element هایی که شما ازش استفاده کردی تغییرات ایجاد شه برنامه به مشکل میخوره (8 سال پیش)
پاسخ به سوال 
konda  7 سال پیش
+1 0

سلام
دوستان، چرا 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();
0 0
خب من امروز با این خطا مواجه شدم ، راه حلش رو زیر میذارم لینک (6 سال پیش)
پاسخ به سوال 
konda  7 سال پیش
+1 0

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

documentTone  =  Jsoup.connect(G.Url).validateTLSCertificates(true).get();
پاسخ به سوال 
احسان  7 سال پیش
0 0

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

راز-سلامتی/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  6 سال پیش
+2 0

حل مشکل خطا در اتصال به 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  6 سال پیش
+2 0

آپلود فایل با 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  6 سال پیش
+1 0

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

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

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

0 0
کافیه ببینید که اون فرم چه لینکی رو داره صدا میکنه و با چه کلید هایی دیتا رو ارسال میکنه شما میتونید همون لینک رو با همون کلید ها براش دیتا ارسال کنید (6 سال پیش)
0 0
مثلا من میخوام یوزر نیم پسورد رو وارد کنم و فرم رو ارسال کنم؛ تو صفحه بعدی که اسم کاربر رو میاره، اسم رو بگیرم و نشون بدم تو برنامه (6 سال پیش)
0 0
سلام.. امکانش هست از طریق این کتابخونه ... تاریخ رو از اینترنت دریافت کرد؟ (6 سال پیش)
0 0
لینک بله شما میتونید تاریخ به متن از جایی بگیرید ولی ، این کار پیشنهاد نمیشه ، بهتره یه خط PHP بنویسید و با لایبری ابدیل تاریخ استاد اونو شمسی و یا میلادی در برنامه نمایش بدید (6 سال پیش)
پاسخ به سوال 
امید شریف مهر  4 سال پیش
0 0

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


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