Java网络爬虫的Jsoup页面解析

18 篇文章 1 订阅

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();
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛者无名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值