شاید روزی شما نیاز به دریافت اطلاعات از یک وب سایت یا سند HTML در برنامه خود داشته باشید، و من بدون هیچ مقدمه ای می گویم که استفاده از کتابخانه jsoup کار شما را بسیار ساده می کند. طبق ویکی ، jsoup یک کتابخانه جاوا منبع باز است که برای تجزیه، استخراج و دستکاری داده های ذخیره شده در اسناد HTML طراحی شده است.
شروع سریع
کتابخانه را می توان به صورت یک فایل jar بارگیری کرد و در یک پروژه قرار داد، یا با استفاده از Maven/Gradle متصل شد. من پیوندی به وب سایت رسمی در پایان مقاله خواهم گذاشت: در آنجا می توانید نسخه فعلی کتابخانه را پیدا کنید. در مثال از اتصال از طریق Maven استفاده خواهیم کرد. بیایید یک وابستگی اضافه کنیم:<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
استفاده
اول از همه، شما باید یک نمونه از کلاس راDocument
از org.jsoup.nodes.Document دریافت کنید که منبع را برای تجزیه نشان می دهد. این می تواند یک فایل محلی یا یک لینک باشد. به عنوان مثال، در این مقاله از وب سایت yandex.ru استفاده می کنیم و سعی می کنیم اخبار فعلی آنها را دریافت کنیم:
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
شناسه ای است که به سایت مورد بازدید ارسال می شود. در بسیاری از سایتها این مهمترین معیار فیلتر ضد اسپم است. Referrer
حاوی URL منبع درخواست است. این روش get()
یک IOException دستهدار را پرتاب میکند، بنابراین میتوانیم همه چیز را در try/catch
یک بلوک بپیچیم، یا فقط آن را با استفاده از throws
. در این مرحله، ما کد منبع این صفحه را دریافت کرده ایم. در صورت لزوم، خود کتابخانه jsoup می تواند عناصر آسیب دیده را بازیابی کند. اکنون تنها کاری که باید انجام دهیم این است که جستجو را به یک بلوک جداگانه محدود کنیم. این روش select()
کاربردهای زیادی دارد: به شما امکان می دهد عناصر را بر اساس برچسب، ویژگی ها، کلاس و سایر پارامترها جستجو کنید. تقریباً تمام مرورگرهای مدرن از توانایی جستجوی سریع کد منبع یک عنصر انتخاب شده پشتیبانی می کنند. با دستکاری های ساده، کد منبع عنصر مورد نیاز خود را پیدا می کنیم و div
یک بلوک با کلاس مشخص شده دریافت می کنیم که از آن برای نمونه برداری استفاده می کنیم. بیایید Elements
از کلاس org.jsoup.select.Elements برای انتخاب همه عناصر از بلوک انتخابی خود استفاده کنیم.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
اکنون چیزی شبیه به این داریم: اکنون تنها کاری که باید انجام دهیم این است که از یک حلقه کوچک برای تکرار در تمام عناصر استفاده کنیم:
for (Element element : listNews.select("a"))
System.out.println(element.text());
این روش text()
به شما امکان می دهد کد نشانه گذاری را کنار بگذارید و فقط ترکیبی از متن را برای همه عناصر ورودی باقی می گذارد. نتیجه اجرا به شرح زیر خواهد بود: به راحتی می توان متوجه شد که تعداد واقعی ردیف های دریافتی با نمایش واقعی صفحه مطابقت ندارد. این همان جایی است که تله ها نهفته است. اگر به کد منبع نشانه گذاری نگاه کنید، متوجه خواهید شد که آخرین اخبار به صورت متحرک در یک بازه زمانی مشخص تغییر می کند. برخی از این "سنگ ها" با نمونه گیری اضافی و البته آزمایش حل می شوند. ممکن است معلوم شود که پنج عنصر اول حاوی اطلاعات مورد نیاز ما خواهد بود و عنصر ششم فقط شامل یک خط خالی اسکریپت شده خواهد بود. همچنین اتفاق میافتد که بلوکها هیچ شناسهای نخواهند داشت، سپس میتوان با استفاده از یک روش مستقیماً get(int index)
به شماره موقعیت عنصر مورد نظر اشاره کرد.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION