HTML هسته وب است، تمام صفحات اینترنتی که مشاهده می کنید، خواه به صورت پویا با استفاده از جاوا اسکریپت، JSP، PHP، ASP یا سایر فناوری های وب تولید شده باشند، بر اساس HTML هستند. در واقع مرورگر شما HTML را تجزیه می کند و آن را به گونه ای نمایش می دهد که برای شما راحت باشد. اما اگر بخواهید یک سند HTML را تجزیه کنید و برخی از عناصر، برچسب ها، ویژگی ها را در آن بیابید یا بررسی کنید که آیا یک عنصر خاص با استفاده از یک برنامه جاوا وجود دارد یا نه، چه؟ اگر چندین سال برنامه نویس جاوا بودید، مطمئن هستم که تجزیه XML را با استفاده از تجزیه کننده هایی مانند DOM یا SAX انجام می دادید. اما، از قضا، مواقعی وجود دارد که شما باید یک سند HTML را از یک برنامه اصلی جاوا که حاوی Servlets و سایر فناوریهای وب جاوا نیست، تجزیه کنید. علاوه بر این، Core JDK همچنین شامل کتابخانههای HTTP یا HTML نیست. به همین دلیل است که وقتی صحبت از تجزیه یک فایل HTML به میان می آید، بسیاری از برنامه نویسان جاوا از گوگل می پرسند که چگونه ارزش یک تگ HTML را در جاوا بدست آورد. وقتی با این مورد روبرو شدم، مطمئن بودم که راه حل یک کتابخانه منبع باز است که عملکرد مورد نیاز من را پیاده سازی می کند، اما نمی دانستم که به اندازه Jsoup فوق العاده و دارای ویژگی های غنی خواهد بود. این نه تنها از خواندن و تجزیه فایلهای HTML، ویژگیها، کلاسهای CSS در سبک JQuery پشتیبانی میکند، بلکه در عین حال به شما امکان میدهد تا آنها را تغییر دهید. با استفاده از Jsoup می توانید هر کاری را که می خواهید با یک سند HTML انجام دهید. در این مقاله، ما یک فایل HTML را تجزیه می کنیم و نام و ویژگی تگ ها را پیدا می کنیم. همچنین نمونه هایی از دانلود و تجزیه HTML از یک فایل و هر URL، مانند صفحه اصلی Google را بررسی خواهیم کرد.
جسوپ چیست؟
Jsoup یک کتابخانه جاوا منبع باز برای کار با HTML واقعی است. این یک API بسیار راحت برای بازیابی و دستکاری داده ها با استفاده از بهترین تکنیک های DOM، CSS و jQuery مانند ارائه می دهد. Jsoup مشخصات WHATWG HTML5 را پیاده سازی می کند و HTML را به همان DOM تجزیه می کند که مرورگرهای مدرن مانند Chrome و Firefox انجام می دهند. در اینجا برخی از ویژگی های مفید کتابخانه Jsoup آورده شده است:- Jsoup می تواند HTML را از یک URL، فایل یا رشته تجزیه و تحلیل کند.
- Jsoup می تواند داده ها را با استفاده از پیمایش DOM یا انتخابگرهای CSS پیدا و استخراج کند.
- Jsoup به شما امکان می دهد عناصر، ویژگی ها و متن HTML را دستکاری کنید.
- Jsoup پاکسازی لیست سفید اطلاعات ارائه شده توسط کاربر را برای جلوگیری از حملات XSS فراهم می کند.
- Jsoup همچنین HTML "تمیز" تولید می کند.
تجزیه HTML در جاوا با استفاده از Jsoup
در این آموزش سه نمونه مختلف از تجزیه و پیمایش یک سند HTML در جاوا با استفاده از Jsoup را خواهیم دید. در مثال اول، ما یک رشته HTML حاوی تگها را به شکل یک رشته جاوا تجزیه میکنیم. در مثال دوم، سند HTML خود را از اینترنت دانلود می کنیم و در مثال سوم، نمونه فایل HTML خود login.html را برای تجزیه دانلود می کنیم. این فایل یک سند HTML نمونه است که شامل یک تگ "title" و یک تگ "div" در بخش "body" است که حاوی فرم HTML است. فرم حاوی فیلدهایی برای وارد کردن نام کاربری و رمز عبور و همچنین دکمه های تنظیم مجدد و تأیید برای اقدامات بعدی است. این HTML "صحیح" است که می تواند بررسی "اعتبار" را پاس کند، به این معنی که همه برچسب ها و ویژگی ها به درستی بسته شده اند. فایل HTML ما به این صورت است:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
</head>
<body>
<div id="login" class="simple" >
<form action="login.do">
Username : <input id="username" type="text" /><br>
Password : <input id="password" type="password" /><br>
<input id="submit" type="submit" />
<input id="reset" type="reset" />
</form>
</div>
</body>
</html>
با Jsoup تجزیه HTML بسیار آسان است، تنها کاری که باید انجام دهید این است که یک متد استاتیک را فراخوانی کرده Jsoup.parse()
و رشته HTML خود را به آن ارسال کنید. Jsoup چندین روش بارگذاری شده را parse()
برای خواندن HTML از یک رشته، یک فایل، از یک URI پایه، از یک URL و از یک ارائه می دهد InputStream
. همچنین می توانید رمزگذاری را برای خواندن صحیح فایل HTML در صورتی که در فرمت UTF-8 نیست، مشخص کنید. این روش parse(String html)
HTML ورودی را به یک شی جدید تجزیه می کند Document
. در Jsoup، یک کلاس Document
از یک کلاس ارث می برد Element
که کلاس را گسترش می دهد Node
. کلاس نیز از کلاس Node
ارث می برد TextNode
. تا زمانی که یک رشته غیر تهی را به متد ارسال کنید، تضمین موفقیت آمیز و معنی دار تجزیه یک شی Document
حاوی (حداقل) عناصر "head" و "body" را خواهید داشت. اگر شی دارید Document
می توانید با فراخوانی متدهای مناسب کلاس Document
و والدین آن Element
و Node
.
برنامه جاوا برای تجزیه سند HTML
در اینجا برنامه کامل ما برای تجزیه یک رشته HTML، یک فایل HTML دانلود شده از اینترنت و یک فایل HTML محلی است. برای اجرای آن، می توانید از یک IDE (Eclipse یا هر نوع دیگر) یا خط فرمان استفاده کنید. در Eclipse این کار بسیار آسان است، فقط کافی است این کد را کپی کنید، یک پروژه جدید جاوا ایجاد کنید، روی پوشه "src" کلیک راست کرده و کد کپی شده را Paste کنید. Eclipse از ایجاد بسته مناسب و فایل کد منبع با نام مناسب مراقبت می کند، بنابراین کار بسیار کمتری است. اگر قبلاً یک پروژه جاوا دارید، این فقط یک مرحله است. برنامه زیر سه نمونه از تجزیه و پیمایش یک فایل HTML را نشان می دهد. در مثال اول، ما مستقیماً یک رشته حاوی HTML را تجزیه می کنیم، در دومی یک فایل HTML دانلود شده از یک URL، در مثال سوم یک سند HTML را از سیستم فایل محلی دانلود و تجزیه می کنیم.import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
/**
* Java Program to parse/read HTML documents from File using Jsoup library.
* Jsoup is an open source library which allows Java developer to parse HTML
* files and extract elements, manipulate data, change style using DOM, CSS and
* JQuery like method.
*
* @author Javin Paul
*/
public class HTMLParser{
public static void main(String args[]) {
// Parse HTML String using JSoup library
String HTMLSTring = "<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ "<title>JSoup Example</title>"
+ "</head>"
+ "<body>"
+ "<table><tr><td><h1>HelloWorld</h1></tr>"
+ "</table>"
+ "</body>"
+ "</html>";
Document html = Jsoup.parse(HTMLSTring);
String title = html.title();
String h1 = html.body().getElementsByTag("h1").text();
System.out.println("Input HTML String to JSoup :" + HTMLSTring);
System.out.println("After parsing, Title : " + title);
System.out.println("Afte parsing, Heading : " + h1);
// JSoup Example 2 - Reading HTML page from URL
Document doc;
try {
doc = Jsoup.connect("http://google.com/").get();
title = doc.title();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Jsoup Can read HTML page from URL, title : " + title);
// JSoup Example 3 - Parsing an HTML file in Java
//Document htmlFile = Jsoup.parse("login.html", "ISO-8859-1"); // wrong
Document htmlFile = null;
try {
htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // right
title = htmlFile.title();
Element div = htmlFile.getElementById("login");
String cssClass = div.className(); // getting class form HTML element
System.out.println("Jsoup can also parse HTML file directly");
System.out.println("title : " + title);
System.out.println("class of div tag : " + cssClass);
}
}
خروجی:
Input HTML String to JSoup :<!DOCTYPE html><html><head><title>JSoup Example</title></head><body><table><tr><td><h1>HelloWorld</h1></tr></table></body></html>
After parsing, Title : JSoup Example
Afte parsing, Heading : HelloWorld
Jsoup Can read HTML page from URL, title : Google
Jsoup can also parse HTML file directly
title : Login Page
class of div tag : simple
تجزیه کننده HTML Jsoup تمام تلاش خود را می کند تا یک تجزیه "تمیز" از HTML ارائه شده توسط شما ایجاد کند، خواه به خوبی شکل گرفته باشد یا نه. می تواند خطاهای زیر را مدیریت کند:
- برچسب های بسته نشده مثلا،
<p>Java <p>Scala to <p>Java</p> <p>Scala</p>
- برچسب های ضمنی به عنوان مثال، موارد باز
<td>Java is Great</td>
در آن پیچیده می شود<table><tr><td>
- Jsoup ساختارهای سند قوی ایجاد می کند (HTML شامل سر و بدنه است، اما بدنه فقط شامل عناصر مرتبط است)
GO TO FULL VERSION