Jsoup页面解析
Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据.
Jsoup的主要功能如下:
1.从一个URL,文件或字符串中解析HTML;
2.使用DOM或CSS选择器来查找、取出数据;
3.可操作HTML元素、属性、文本;
Jsoup依赖:
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Jsoup直接访问URL:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URL;
public class Main {
public static void main(String[] args) {
//解析url地址,第一个参数是访问的url,第二个参数是访问时候的超时时间
try
{
Document document= Jsoup.parse(new URL("https://www.sina.com.cn"),2000);
String title=document.getElementsByTag("title").first().text();//使用标签获取title标签
System.out.println(title);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
虽然Jsoup内置网络连接功能,但出于专业的包做专业的事,一般获取html源码的工作交给httpclient包再由Jsoup进行字符串解析
Jsoup解析字符串:
读取文件,获取字符串
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
public class Main {
public static void main(String[] args) {
try
{
String content= FileUtils.readFileToString(new File("文件路径"));
Document document= Jsoup.parse(content);
String title=document.getElementsByTag("title").first().text();
System.out.println(title);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
使用DOM方式遍历文档:
元素获取:
作用 | 方法名 |
---|
根据id查询元素 | getElementById |
根据标签获取元素 | getElementsByTag |
根据class获取元素 | getElementsByClass |
根据属性获取元素 | getElementsByAttribute |
例:(测试html文件为sina首页源码)
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
public class Main {
public static void main(String[] args) {
try
{
String content= FileUtils.readFileToString(new File("文件路径"));
Document document= Jsoup.parse(content);
String id=document.getElementById("SI_Top_Wrap").text();
System.out.println(id);
String tag=document.getElementsByTag("span").text();
System.out.println(tag);
String sclass=document.getElementsByClass("tn-tab").text();
System.out.println(sclass);
String attribute=document.getElementsByAttribute("target").text();
System.out.println(attribute);
String attribute_value=document.getElementsByAttributeValue("suda-uatrack","key=index_new_menu&value=sina_apps_list_click").text();//属性和属性值
System.out.println(attribute_value);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Selector 选择器概述:
字段 | 作用 | 例 |
---|
tagname | 通过标签查找元素 | 如: span |
#id | 通过ID查找元素 | 如: #SI_Top_Wrap |
.class | 通过class名称查找元素 | 如: .tn-tab |
[attribute] | 利用属性查找元素 | 如: [target] |
[attr=value] | 利用属性值查找元素 | 如: [suda-uatrack=key=index_new_menu&value=sina_apps_list_click] |
例(Selector选择器应用):
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
public class Main {
public static void main(String[] args) {
try
{
String content= FileUtils.readFileToString(new File("文件路径"));
Document document= Jsoup.parse(content);
Elements elements_span=document.select("span");
for(Element element:elements_span)
{
System.out.println(element.text());
}
Elements elements_SI_Top_Wrap=document.select("#SI_Top_Wrap");
for(Element element:elements_SI_Top_Wrap)
{
System.out.println(element.text());
}
Elements elements_tn_tab=document.select(".tn-tab");
for(Element element:elements_tn_tab)
{
System.out.println(element.text());
}
Elements elements_target=document.select("[target]");
for(Element element:elements_target)
{
System.out.println(element);
}
Elements elements_attr=document.select("[suda-uatrack=key=index_new_menu&value=sina_apps_list_click]");
for (Element element:elements_attr)
{
System.out.println(element.text());
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Selector选择器组合使用
字段 | 匹配内容 | 例 |
---|
el#id | 元素+ID | 如:div#SI_Top_Wrap |
el.class | 元素+class | 如:div.top-nav |
el[attr] | 元素+属性名 | 如:div[node-type] |
- | 任意组合 | 如:div[node-type=menu].tn-title |
ancestor child | 查找某个元素下子元素 | 如:li>a |
parent>clild | 查找某个父元素下的直接子元素 | 如:ul>li>a |
parent>* | 查找某个父元素下所有直接子元素 | 如:li>* |
例(Selector选择器组合):
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
public class Main {
public static void main(String[] args) {
try
{
String content= FileUtils.readFileToString(new File("文件路径"));
Document document= Jsoup.parse(content);
Elements elements_elid=document.select("div#SI_Top_Wrap");
for(Element element:elements_elid)
{
System.out.println(element.text());
}
Elements elements_top_nav=document.select("div.top-nav");
for(Element element:elements_top_nav)
{
System.out.println(element.text());
}
Elements elements_node_type=document.select("div[node-type]");
for(Element element:elements_node_type)
{
System.out.println(element.text());
}
Elements elements_ever=document.select("div[node-type=menu].tn-title");
for(Element element:elements_ever)
{
System.out.println(element);
}
Elements elements_li_a=document.select("li>a");
for(Element element:elements_li_a)
{
System.out.println(element.text());
}
Elements elements_parent_child=document.select("ul>li>a");
for (Element element:elements_parent_child)
{
System.out.println(element.text());
}
Elements elements_parent_=document.select("li>*");
for(Element element:elements_parent_)
{
System.out.println(element.text());
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}