אולי מתישהו תצטרכו לקבל מידע מאתר אינטרנט או ממסמך 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
מכיל את כתובת האתר של מקור הבקשה. השיטה 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