ניתוח HTML ב- Java באמצעות Jsoup

1. סקירה כללית

Jsoup היא ספריית Java פתוחה המשמשת בעיקר לחילוץ נתונים מ- HTML. זה גם מאפשר לך לתפעל ולהפיק HTML. יש לו קו פיתוח יציב, תיעוד נהדר ו- API שוטף וגמיש. ניתן להשתמש ב- Jsoup גם לניתוח ובניית XML.

במדריך זה נשתמש בבלוג האביב כדי להמחיש תרגיל גירוד המדגים כמה תכונות של jsoup:

  • טוען: אחזור וניתוח ה- HTML ל- מסמך
  • סינון: בחירת הנתונים הרצויים אל אלמנטים וחוצה אותו
  • חילוץ: השגת תכונות, טקסט ו- HTML של צמתים
  • שינוי: הוספה / עריכה / הסרת צמתים ועריכת תכונותיהם

2. תלות של Maven

כדי להשתמש בספריית jsoup בפרויקט שלך, הוסף את התלות שלך pom.xml:

 org.jsoup jsoup 1.10.2 

תוכל למצוא את הגרסה האחרונה של jsoup במאגר Maven Central.

3. Jsoup at a Glance

Jsoup טוען את ה- HTML של הדף ובונה את עץ ה- DOM המתאים. עץ זה עובד באותה צורה כמו ה- DOM בדפדפן, ומציע שיטות דומות ל- JavaScript של jQuery ו- וניל לבחירה, חצייה, מניפולציה של טקסט / HTML / תכונות והוספה / הסרה של אלמנטים.

אם אתה מרגיש בנוח עם בוחרי צד לקוח ומעבר / מניפולציה של DOM, תמצא jsoup מוכר מאוד. בדוק כמה קל להדפיס את פסקאות העמוד:

מסמך doc = Jsoup.connect ("// example.com"). Get (); doc.select ("p"). forEach (System.out :: println);

זכור כי jsoup מפרש HTML בלבד - הוא אינו מפרש JavaScript. לכן שינויים ב- DOM שבדרך כלל יתקיימו לאחר טעינת העמודים בדפדפן התומך ב- JavaScript לא יראו ב- jsoup.

4. טוען

שלב הטעינה כולל אחזור וניתוח של ה- HTML ל- מסמך. Jsoup מבטיחה ניתוח של כל HTML, מהלא חוקי ביותר לאלו המאומת לחלוטין, כפי שהיה עושה דפדפן מודרני. ניתן להשיג זאת באמצעות טעינת a חוּט, InputStream, א קוֹבֶץ או כתובת אתר.

בואו נטען א מסמך מכתובת האתר של בלוג האביב:

מחרוזת blogUrl = "//spring.io/blog"; מסמך doc = Jsoup.connect (blogUrl) .get ();

שימו לב ל לקבל שיטה, הוא מייצג שיחת HTTP GET. אתה יכול גם לבצע HTTP POST עם ה- הודעה שיטה (או שאתה יכול להשתמש ב- שיטה המקבל את סוג שיטת HTTP כפרמטר).

אם אתה צריך לזהות קודי מצב לא תקינים (למשל 404), עליך לתפוס את HttpStatusException יוצא מן הכלל:

נסה {Document doc404 = Jsoup.connect ("// spring.io/will-not-be-found"). get (); } לתפוס (HttpStatusException לשעבר) {// ...}

לפעמים, החיבור צריך להיות קצת יותר מותאם אישית. Jsoup.connect (...) מחזירה א חיבור המאפשר לך להגדיר, בין היתר, את סוכן המשתמש, המפנה, פסק זמן לחיבור, קובצי cookie, נתוני פרסום וכותרות:

חיבור חיבור = Jsoup.connect (blogUrl); connection.userAgent ("מוזילה"); חיבור.פסק זמן (5000); connection.cookie ("cookiename", "val234"); connection.cookie ("cookiename", "val234"); connection.referrer ("// google.com"); connection.header ("כותרת אבטחה", "xyz123"); מסמך docCustomConn = connection.get ();

מכיוון שהחיבור עובר על ממשק שוטף, אתה יכול לשרשר את השיטות האלה לפני שאתה קורא לשיטת ה- HTTP הרצויה:

מסמך docCustomConn = Jsoup.connect (blogUrl) .userAgent ("Mozilla"). Timeout (5000) .cookie ("cookiename", "val234") .cookie ("anothercookie", "ilovejsoup"). Referrer ("// google .com ") .header (" headersecurity "," xyz123 ") .get ();

אתה יכול ללמוד עוד על חיבור הגדרות על ידי גלישה ב- Javadoc המתאים.

5. סינון

עכשיו שיש לנו את ה- HTML שהומר ל- מסמךהגיע הזמן לנווט בו ולמצוא את מה שאנחנו מחפשים. זה המקום בו הדמיון ל- jQuery / JavaScript ניכר יותר, מכיוון שהסלקטורים ושיטות המעבר שלו דומים.

5.1. בוחר

ה מסמךבחר השיטה מקבלת א חוּט המייצג את הבורר, תוך שימוש באותו תחביר בורר כמו ב- CSS או JavaScript, ומאחזר את רשימת ההתאמה של אלמנטים. רשימה זו יכולה להיות ריקה אך לא ריק.

בואו נסתכל על כמה אפשרויות באמצעות בחר שיטה:

קישורי אלמנטים = doc.select ("a"); קטעי אלמנטים = doc.select ("קטע"); לוגו אלמנטים = doc.select (". אביב-לוגו - מיכל"); עמוד אלמנטים = doc.select ("# pagination_control"); אלמנטים divsDescendant = doc.select ("div header"); אלמנטים divsDirect = doc.select ("כותרת> div");

אתה יכול גם להשתמש בשיטות מפורשות יותר בהשראת הדפדפן DOM במקום הכללי בחר:

רכיב pag = doc.getElementById ("pagination_control"); אלמנטים desktopOnly = doc.getElementsByClass ("desktopOnly");

מאז אֵלֵמֶנט הוא מעמד-על של מסמך, תוכל ללמוד עוד על עבודה עם שיטות הבחירה ב מסמך ו אֵלֵמֶנט ג'אוודוקס.

5.2. חוצה

חצייה פירושה ניווט על פני עץ ה- DOM. Jsoup מספקת שיטות הפועלות על מסמך, על סט של אלמנטים, או על ספציפי אֵלֵמֶנט, המאפשר לך לנווט להורים, אחים או ילדים של צומת.

כמו כן, תוכל לקפוץ לראשון, האחרון וה- n (באמצעות אינדקס מבוסס 0) אֵלֵמֶנט בסט של אלמנטים:

אלמנט firstSection = סעיפים.פירסט (); אלמנט lastSection = קטעים.לאסט (); אלמנט secondSection = סעיפים.גט (2); אלמנטים allParents = firstSection.parents (); אלמנט אב = firstSection.parent (); ילדים אלמנטים = firstSection.children (); אלמנטים אחים = firstSection.siblingElements ();

אתה יכול גם לחזור על הבחירות. למעשה, כל דבר מסוג אלמנטים ניתן לחזור:

section.forEach (el -> System.out.println ("סעיף:" + el));

באפשרותך לבצע בחירה מוגבלת לבחירה קודמת (בחירת משנה):

Elements sectionParagraphs = firstSection.select (". פסקה");

6. חילוץ

כעת אנו יודעים כיצד להגיע לאלמנטים ספציפיים, ולכן הגיע הזמן לקבל את התוכן שלהם - כלומר את התכונות שלהם, HTML או טקסט ילד.

התבונן בדוגמה זו שבוחרת את המאמר הראשון מתוך הבלוג ומקבלת את התאריך שלו, את טקסט החלק הראשון שלו, ולבסוף את ה- HTML הפנימי והחיצוני שלו:

אלמנט firstArticle = doc.select ("מאמר"). First (); Element timeElement = firstArticle.select ("זמן"). First (); מחרוזת dateTimeOfFirstArticle = timeElement.attr ("זמן זמן"); אלמנט sectionDiv = firstArticle.select ("קטע div"). First (); מחרוזת sectionDivText = sectionDiv.text (); מאמר מחרוזת HTML = firstArticle.html (); מחרוזת outerHtml = firstArticle.outerHtml ();

להלן מספר טיפים שכדאי לזכור בעת בחירה ושימוש בבוחרים:

  • הסתמך על התכונה "צפה במקור" בדפדפן שלך ולא רק בדף DOM כפי שהוא עשוי להשתנות (בחירה במסוף הדפדפן עשויה להניב תוצאות שונות מ- jsoup)
  • הכירו את הסלקטורים שלכם מכיוון שיש הרבה כאלה וזה תמיד טוב שלפחות ראיתם אותם לפני כן; שליטה בבוחרים לוקח זמן
  • השתמש בגן ​​שעשועים לבוררים כדי להתנסות בהם (הדבק שם שם לדוגמה)
  • היו פחות תלויים בשינויים בדפים: כוונו לבוחרים הקטנים ביותר והפחות מתפשרים (למשל. העדיפו מבוסס מזהים)

7. שינוי

שינוי כולל תכונות הגדרה, טקסט ו- HTML של אלמנטים, כמו גם הוספה והסרה של אלמנטים. זה נעשה לעץ DOM שנוצר בעבר על ידי jsoup - ה- מסמך.

7.1. הגדרת תכונות וטקסט / HTML פנימי

כמו ב- jQuery, השיטות להגדרת תכונות, טקסט ו- HTML נושאות את אותם שמות אך גם מקבלות את הערך שיש להגדיר:

  • attr () - מגדיר את ערכי התכונה (היא יוצרת את התכונה אם היא לא קיימת)
  • טֶקסט() - מגדיר טקסט פנימי של אלמנט, מחליף תוכן
  • html () - מגדיר אלמנט HTML פנימי, מחליף תוכן

בואו נסתכל על דוגמה מהירה לשיטות אלה:

timeElement.attr ("datetime", "2016-12-16 15: 19: 54.3"); sectionDiv.text ("סרגל foo"); firstArticle.select ("h2"). html (""); 

7.2. יצירה והוספה של אלמנטים

כדי להוסיף אלמנט חדש, עליך לבנות אותו תחילה על ידי הפעלה מיידית אֵלֵמֶנט. פעם ה אֵלֵמֶנט נבנה, אתה יכול לצרף אותו לאחר אֵלֵמֶנט משתמש ב appendChild שיטה. החדש שנוצר וצורף אֵלֵמֶנט יוכנס בסוף האלמנט איפה appendChild נקרא:

קישור אלמנט = אלמנט חדש (Tag.valueOf ("a"), "") .text ("בדוק את האתר המדהים הזה!") .Attr ("href", "//baeldung.com") .attr ("target" , "_ ריק"); firstArticle.appendChild (קישור);

7.3. הסרת אלמנטים

כדי להסיר אלמנטים, תחילה עליך לבחור אותם ולהפעיל את לְהַסִיר שיטה.

לדוגמה, בואו נסיר את הכל

  • תגים המכילים את "navbar-link ” כיתה מ מסמך, וכל התמונות מהמאמר הראשון:

    doc.select ("li.navbar-link"). הסר (); firstArticle.select ("img"). remove ();

    7.4. המרת המסמך ששונה ל- HTML

    לבסוף, מכיוון ששינינו את ה- מסמך, אולי נרצה לבדוק את העבודה שלנו.

    לשם כך נוכל לחקור את מסמך עץ DOM על ידי בחירה, חצייה וחילוץ באמצעות השיטות המוצגות, או שאנו פשוט יכולים לחלץ את ה- HTML שלו כ- חוּט משתמש ב html () שיטה:

    מחרוזת docHtml = doc.html ();

    ה חוּט פלט הוא HTML מסודר.

    8. מסקנה

    Jsoup היא ספרייה נהדרת לגרד כל דף. אם אתה משתמש ב- Java ואינך זקוק לגרידה מבוססת דפדפן, זו ספריה שיש לקחת בחשבון. זה מוכר וקל לשימוש מכיוון שהוא עושה שימוש בידע שיש לך בפיתוח חזית ועוקב אחר שיטות עבודה ודפוסי עיצוב טובים.

    תוכל ללמוד עוד על גירוד דפי אינטרנט באמצעות jsoup על ידי עיון בממשק ה- API של jsoup וקריאת ספר הבישול של jsoup.

    קוד המקור המשמש במדריך זה נמצא בפרויקט GitHub.


    $config[zx-auto] not found$config[zx-overlay] not found