jsoup 使用总结4--高级用法之 script js 脚本
jsoup 使用总结4--高级用法之 script js 脚本
大部分时候,我们使用jsoup解析网页的时候,都是直接找到某一类元素,或者按某种selector查询;具体使用方法可以参考jsoup官网文档
那么你有没有实际操作过,查找script js 脚本呢,因为很多时候页面的内容是根据js动态生成的,或者数据是动态变更;那么这个时候,我们只是获取html页面中script js脚本之间的内容。
部分html代码:
<div class="example_row">
<a href="http://www.example.com/news.html" target="_blank">真相</a></h3>
<a href="http://www.example.com/news/cat/13" target="_blank">今日头条</a>
<a href="http://www.example.com/news/cat/16" target="_blank">各地新闻</a>
<a href="http://www.example.com/news/cat/14" target="_blank">行业报告</a>
<a href="http://www.example.com/news/cat/15" target="_blank">政府政策</a>
<a href="http://www.example.com/news/cat/18" target="_blank">疾病防护</a>
<a href="http://www.example.com/news/cat/20" target="_blank">科普</a>
</div>
....
<script type="text/javascript">
var result = {key1:value1, key2:value2 ...}
</script>
java代码:
Document doc = Jsoup.connect("www.example.com").timeout(0).get();
Elements links = doc.select("div.example_row").select("a");
for(Element link : links)
{
String linkHref = link.attr("href");
String linkText = link.text();
...
}
Element link = doc.select("a").first();
Element link_2 = doc.select("a").last();
上面的方式就可以帮我们查找到js 中的数据。
还有一种我在实际工作中遇到的情况, js 很复杂,并不像上面的那么一下子就可以catch到:
html代码:
<script type="text/javascript">
var result = {key1:value1, key2:value2 ...}
var option_1 = {
color: ['#79b05f', '#e58c65'],
tooltip : {
trigger: 'change'
},
legend: {
data:['标准1','标准2']
},
xchange : [
{
type : 'category',
boundaryGap : false,
data : ["22\u65e501\u65f6","22\u65e502\u65f6","22\u65e502\u65f6","22\u65e503\u65f6","22\u65e503\u65f6","22\u65e504\u65f6","22\u65e504\u65f6","22\u65e505\u65f6","22\u65e505\u65f6","22\u65e506\u65f6","22\u65e506\u65f6","22\u65e507\u65f6","22\u65e507\u65f6","22\u65e508\u65f6","22\u65e508\u65f6","22\u65e509\u65f6","22\u65e509\u65f6","22\u65e58\u65f6","22\u65e58\u65f6","22\u65e511\u65f6","22\u65e511\u65f6","22\u65e512\u65f6","22\u65e512\u65f6","22\u65e513\u65f6"],
changeLine: {
lineStyle : {
color: '#d4d4d4'
}
}
}
],
ychange : [
{
type : 'value',
changeLabel : {
formatter: '{value}'
},
changeLine: {
lineStyle : {
color: '#d4d4d4'
}
}
}
],
series : [
{
name:'标准1',
type:'line',
data:[37,37,37,162,162,167,167,40,40,44,44,46,46,48,48,47,47,166,166,39,39,38,38,163] },
{
name:'标准2',
type:'line',
data:[83,84,84,12,12,124,124,132,132,20,20,24,24,28,28,25,25,123,123,88,88,85,85,2] }
]
};
...
</script>
那么针对这种情况jsoup如何破解呢,享受在jsoup的便捷中,思考,搜索,仍然误解;
发现这种问题jsoup还真解决不了。
那就换正则表达式试试。这里推荐一个在线正则工具 regexr
换了正则,然后不停的try,终于ok了:
java 代码:
Document doc = Jsoup.connect("www.example.com").timeout(0).get();
Elements scripts = doc.select("script");
for(Element script : scripts)
{
if(script.html().contains("var option_1 =")) //注意这里一定是html(), 而不是text()
{
String str = data.html().replace("\n", ""); //这里是为了解决 无法多行匹配的问题
String pattern = "var option_1 = \\{(.*?)\\};"; //()必须加,
Pattern r = Pattern.compile(pattern,Pattern.MULTILINE);// Pattern.MULTILINE 好像没有什么用,所以才使用上面的replace
Matcher m = r.matcher(str);
if(m.find())
{
String option_1 = m.group();
option_h24 = option_h24.replace("var option_1 = ", "");
JSONObject json = new JSONObject(option_1);
...
}
}
...
}
希望能解决你手边的问题。
另外推荐阅读jsoup的官网文档,我80%的问题都在官网找到了方法。
jsoup 使用总结4--高级用法之 script js 脚本的更多相关文章
- Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试
转载自 https://my.oschina.net/leejun2005/blog/399108 1.Fiddler Script 1.1 Fiddler Script简介 在web前端开发的过程中 ...
- Jquery remove 高级用法
Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...
- nmap命令-----高级用法
探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测): 下面去扫描10.0.3.0/24这个网段的的主机 nmap ...
- Jenkins高级用法 - Jenkinsfile 介绍及实战经验
系列目录 1.Jenkins 安装 2.Jenkins 集群 3.Jenkins 持续集成 - ASP.NET Core 持续集成(Docker&自由风格&Jenkinsfile) 4 ...
- Linux之shell脚本for、while、case语句的高级用法
1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...
- jquery ajax实例教程和一些高级用法
jquery ajax的调用方式:jquery.ajax(url,[settings]),jquery ajax常用参数:红色标记参数几乎每个ajax请求都会用到这几个参数,本文将介绍更多jquery ...
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- 爬虫—Requests高级用法
Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...
- Go template高级用法、深入详解、手册、指南、剖析
入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...
随机推荐
- ubuntu16.04中可以用于教学的有趣的应用
ubuntu16.04中可以用于教学的有趣的应用 在ubuntu自带的软件中心里,内置了非常丰富的教育应用,可以用于物理,化学等科学课教学,只选取我用过用于教学的软件,优秀的软件不止这些,可以慢慢发掘 ...
- C#弹出对话框
一.基于WINFORM下的选择对话框 在WINFORM下,我们可以利用系统的对话框(MessageBox)来实现,具体思路是读取MessageBox的返回值(YES或NO)来达到对操作的控制.下面是一 ...
- Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679,专题目录:http://blog.csdn.net/dba_huangzj ...
- oracle ebs应用产品安全性-安全性规则
定义: 通过为段指定包括下限值与上限值的值范围,可以定义安全性规则要素.安全性规则要素适用于包括在指定值范围内的所有段值. 可以将每个安全性规则要素标识为"包括"或"排除 ...
- Chipmunk僵尸物理对象的出现和解决(四)
接上一篇,我们看看五角星和反弹棒碰撞时的代码: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode * ...
- 《java入门》第一季之类(String类字符串一旦被赋值就没法改变)
毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被 ...
- Linux共享内存编程实例
/*共享内存允许两个或多个进程进程共享同一块内存(这块内存会映射到各个进程自己独立的地址空间) 从而使得这些进程可以相互通信. 在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编 ...
- 【Qt编程】Qt学习笔记<一>
1. 在创建项目时,项目名和路径中都不能出现中文. 2. 可以使用Ctrl + "+"和Ctrl + "-"来改变程序的字体大小(Ctrl+ ...
- WebService开发指南
WebServiceInAurora Web Service Web Service是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作.在Aurora框架 ...
- TrueType字体的后缀名解释
OpenType标准定义了OpenType文件名称的后缀名.包含TureType字体的OpenType文件后缀名为.ttf,包含PostScript字体的文件后缀名为.OTF.如果是包含一系列True ...