ربما ستحتاج يومًا ما إلى الحصول على معلومات من موقع ويب أو مستند HTML في تطبيقك، وسأقول دون مزيد من اللغط أن استخدام مكتبة jsoup سيبسط مهمتك إلى حد كبير. وفقًا للويكي ، فإن jsoup هي مكتبة Java مفتوحة المصدر مصممة لتحليل واستخراج ومعالجة البيانات المخزنة في مستندات 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