需求:需要获取另外网站页面的内容数据
前期想之前在前台用js来解析,发现有跨域问题,解决起来很麻烦。
所以决定在后台使用jousp解决
引用
https://blog.csdn.net/qq_37933685/article/details/85233318
此PO介绍十分详细,有需要的可以去仔细了解。
1、首先引用jousp的jar包,直接在pom.xml引入即可。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
首先连接到需要访问的url-------------Jsoup.connect()
try
{
Document document = Jsoup.connect("http://www. weibo.com").get();
System.out.println(document.title());
}
catch (IOException e)
{
e.printStackTrace();
}
此后就可同样操作
//通过class查询
document.getElementsByClass(“page_nav page”)
以此获取相应的数据
寻找元素
-
getElementById(String id) getElementsByTag(String tag)
-
getElementsByClass(String className) getElementsByAttribute(String
key) (及相关方法) -
元素的兄弟姐妹:siblingElements(),firstElementSibling(),
lastElementSibling(),nextElementSibling(),previousElementSibling() -
图:parent(),children(),child(int index)
处理元素数据
- attr(String key)获取和attr(String key, String value)设置属性
- attributes() 获得所有属性
- id(),className()和classNames()
- text()获取和text(String value)设置文本内容
- html()获取和html(String value)设置内部HTML内容
- outerHtml() 获取外部HTML值
- data()获取数据内容(例如script和style标签)
- tag() 和 tagName()
操纵HTML和文本
- append(String html), prepend(String html)
- appendText(String text), prependText(String text)
- appendElement(String tagName), prependElement(String tagName)
- html(String value)
更多详尽请查阅api文档
贴一个Demo
获取Table内数据
Document waterdocument;
try {
waterdocument = Jsoup.connect(waterUrl).header("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36").get();
//表格
Elements waterelements = waterdocument.getElementsByClass("data_table");
//select("table#table_style_e");
for(Element element:waterelements){
if(element.text()!=null&& !"".equals(element.text())){
Elements es = element.select("tr");
for(Element tdelement:es){
Elements tdes = tdelement.select("td");
for(int i = 0; i < tdes.size(); i++){
//do something
}
}
}
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
补上一个例子
我需要获取到2019年12月02日的text
但这个div 没有专属的class 。
顶部的class为itablist block
直接获取获取会把下面data_table中的数据一起打印出来,这不是我想要的。
所以采用remove()
反向获得年份的数据
Elements elements = document.getElementsByClass("itablist block").first().children().select("div:not(.data_table)").remove();