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 脚本的更多相关文章

  1. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试

    转载自 https://my.oschina.net/leejun2005/blog/399108 1.Fiddler Script 1.1 Fiddler Script简介 在web前端开发的过程中 ...

  2. Jquery remove 高级用法

    Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...

  3. nmap命令-----高级用法

    探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):  下面去扫描10.0.3.0/24这个网段的的主机 nmap ...

  4. Jenkins高级用法 - Jenkinsfile 介绍及实战经验

    系列目录 1.Jenkins 安装 2.Jenkins 集群 3.Jenkins 持续集成 - ASP.NET Core 持续集成(Docker&自由风格&Jenkinsfile) 4 ...

  5. Linux之shell脚本for、while、case语句的高级用法

    1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...

  6. jquery ajax实例教程和一些高级用法

    jquery ajax的调用方式:jquery.ajax(url,[settings]),jquery ajax常用参数:红色标记参数几乎每个ajax请求都会用到这几个参数,本文将介绍更多jquery ...

  7. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  8. 爬虫—Requests高级用法

    Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...

  9. Go template高级用法、深入详解、手册、指南、剖析

    入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...

随机推荐

  1. Java 8新特性探究(三)泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...

  2. 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

    伴随着毕业论文的完成,这两天终于腾出了空闲,又有时间搞搞FFMPEG的研究了.想着之前一直搞的都是FFMPEG解码方面的工作,很少涉及到FFMPEG编码方面的东西,于是打算研究一下FFMPEG的编码. ...

  3. iOS中 UITextView文本视图 技术分享

    UITextView: 文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文. UITextField的用处多,UITextView的用法也不 ...

  4. C语言的布尔类型(_Bool)

    也许很多人都和我一样,不知道现在的C语言已经有了布尔型:从C99标准开始,类型名字为"_Bool". 在此之前的C语言中,使用整型int来表示真假.在输入时:使用非零值表示真:零值 ...

  5. Chipmunk僵尸物理对象的出现和解决(四)

    接上一篇,我们看看五角星和反弹棒碰撞时的代码: -(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair star:(CCNode * ...

  6. 海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘

    http://blog.csdn.net/pipisorry/article/details/48894977 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  7. rambbit mq 安装

    https://blog.csdn.net/lmjy102/article/details/78571078 http://www.rabbitmq.com/tutorials/tutorial-on ...

  8. 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)

    . 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...

  9. cocos2d-x项目与vs2013编译

    cocos2d-x项目与vs2013编译 2014-12-17 cheungmine 因为C++11引入了众多开源软件的特性,导致cocos2d-x r3.3项目无法用 vs2010编译. 所以安装了 ...

  10. Android百分比布局支持库(android-percent-support)

    Android中提供了五种布局,其中用的最多的就是:LinearLayout, RelativeLayout 和 FrameLayout这三种布局,在对某一界面进行布局时最先想到也是通过这三种来布局的 ...