Jsoup 是一个强大的Java库,专门用于解析HTML文档。它不仅可以解析标准的HTML页面,还能处理一些非标准或“脏”的HTML内容。以下是Jsoup能够解析的网页类型及其特点:
1. 标准HTML页面
Jsoup能够解析符合HTML规范的网页,包括HTML4和HTML5。它可以解析标签、属性、文本内容等,并提供方便的方法来提取和操作这些元素。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><head><title>Test</title></head><body><p>Hello, Jsoup!</p></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
}
}
2. 非标准HTML页面
Jsoup能够处理一些不符合HTML规范的网页,例如缺少闭合标签、嵌套错误等。它会尝试修复这些错误,使HTML文档能够被正确解析。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><head><title>Test</title></head><body><p>Hello, Jsoup!";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
}
}
3. 动态加载的HTML内容
虽然Jsoup本身不支持JavaScript,但它可以解析通过JavaScript动态生成的HTML内容,只要这些内容在页面加载时已经存在。如果页面内容是通过AJAX动态加载的,可以使用HttpClient
或Selenium
等工具获取完整的HTML内容,然后再用Jsoup解析。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><head><title>Test</title></head><body><p>Hello, Jsoup!</p></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
}
}
4. XML文档
Jsoup也可以解析XML文档,但需要注意的是,Jsoup默认使用HTML解析器。如果需要解析XML,可以使用Jsoup.parse(xmlString, "", Parser.xmlParser())
。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String xml = "<root><person><name>John</name><age>30</age></person></root>";
Document doc = Jsoup.parse(xml, "", org.jsoup.parser.Parser.xmlParser());
Elements persons = doc.select("person");
for (Element person : persons) {
System.out.println("Name: " + person.select("name").text());
System.out.println("Age: " + person.select("age").text());
}
}
}
5. HTML片段
Jsoup不仅可以解析完整的HTML文档,还可以解析HTML片段。这对于解析部分页面内容非常有用。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String htmlFragment = "<div><p>Hello, Jsoup!</p></div>";
Document doc = Jsoup.parse(htmlFragment, "", org.jsoup.parser.Parser.fragmentParser());
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
}
}
6. 本地HTML文件
Jsoup可以解析本地HTML文件,只需将文件路径传递给Jsoup.parse()
方法即可。
示例代码:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
try {
Document doc = Jsoup.parse(new File("example.html"), "UTF-8");
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结
Jsoup是一个功能强大的HTML解析库,能够处理多种类型的网页,包括标准HTML页面、非标准HTML页面、动态加载的HTML内容、XML文档、HTML片段以及本地HTML文件。通过Jsoup,开发者可以轻松地提取和操作网页中的数据,适用于各种爬虫和数据处理场景。