آموزش استفاده از کتابخانه Jsoup
jsoup HTML parser library
این کتابخانه برای پارس کردن صفحات HTML بکار میره <
شما میتونید با وارد شدن به یک صفحه HTML هر مقدار String درون اون رو بیرون بکشید <
همچنین بجای والی و رتروفیت میتونید ازش در ارتباط با وب سرویس استفاده کنید ، خیلی ساده و راحت هست کار باهاش
برای بهتر متوجه شدن کارایی این کتابخانه < در پست بعد ، دنبال کنید <
سلام دوستان
امروز وقت کردم و 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);
Thread thread = new Thread(new Runnable() { @Override public void run() { handler.post(new Runnable() { @Override public void run() { txt.setText("هر چی دوست داشتی"); } }); } }); thread.start();
بفرمایید
دوستان توی پروژه ای از jsoup استفاده کردم. برنامه اجرا میکنه و هیچ مشکلی نداره بعد اینکه برنامه رو با keytool ازش خروجی میگیرم موقع اجرای اکتیویتی مربوط به jsoup خطا میده . ممنون میشم راهنمایی کنید .
دوستان گلم سلام.کسی میتونه بهم کمک کنه در خصوص کدهای زیر؟چطور میشه این متغیرهای هم نام رو که توی وب پیج به صورت مکرر تکرار شده اند رو مقدارهاشون رو گرفت؟البته چون این مقادیر بصورت آنلاین در حال تغییره و داینامیکه توی این کدهای وب پیج نمایش داده نشده اند.کسی پروژه یا طرح یا ایده ای در این خصوص داشته که بتونه کمکم کنه؟پیشاپیش از همکاریتون متشکرم
<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>
دوستان عزیز در مورد این تاپیک یه سوال پیش اومده واسم.اگه سایت قالبش عوض شه یا کلا تغییرات دیگه ای ایجاد شه توی اپ تغییری ایجاد میشه یا نه؟؟؟؟؟؟
سلام
دوستان، چرا 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();
دوستان، نوشتاری اشتباهی پیش اومده
منظورم بود که
حتی این کد هم امتحان کردم، نشد. باید می نوشتم (نشد) ، آخه در پست قبلی نوشتم (شد)، تا فکر نکنید که حل شده D:
این کد هم امتحان کردم، بازم کار نکرد
documentTone = Jsoup.connect(G.Url).validateTLSCertificates(true).get();
سلام دوستان
من یه مشلی دارم با آدرس هایی که با کلمات فارسی ترکیب شدن ،مثلا :
راز-سلامتی/http://tandorosti.com وقتی همچین url هایی به jsoup میدم درست کار نمی کنه!
چیکار باید کرد ؟ ممنون
----------------------------------------------- راه حل ----------------------------
اینطوری حل شد
String placesUrl = String.format("http://www.test/fa/event-",
URLEncoder.encode("سالیانه","UTF-8"));
Document document =Jsoup.connect(placesUrl).get();
حل مشکل خطا در اتصال به 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
آپلود فایل با 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();
ممنون از آموزش جالب و بسیار کاربردی
من یه پله ازین آموزش بالاترش رو سوال دارم! چطوری میشه اطلاعات یه فرم رو با استفاده از آیدی فیلدهاش با استفاده از اپلیکیشن پر کرد و فرم رو ارسال کرد؟
نتیجه این فرم ارسالی گام بعدی هست که میشه با استفاده ازین کتابخونه توی برنامه خروجی دلخواه رو نشون داد. ممنون میشم کسی اطلاعاتی داره راهنمایی کنه
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .