jsoup解析html 用法

最近在项目中做一个需求,将一个网页中的外部的图片下载到我们自己的服务器,方法就是对html里的内容匹配出img标签的src的地址,然后利用这个地址下载图片,但总是会出现有的src的地址不是正确的图片资源,出现下载错误的情况,而我在img标签中发现还有data-src属性或者original-src属性,且这些属性里的地址是可下载的。

这就为我带来一个思路,匹配出img标签中所有属性中包含src字符串的都筛选出来。如果src的地址下载不了,那就用data-src或者其他的带src字符串属性的地址去下载。

关于怎么获取img标签中的src的属性,大家可能都了解用正则表达式去匹配。 
这里先用正则表达式做个小测试吧:

       String html="

pic1:\"\"/ pic2: \"\"/,pic3:\"\"/

"
;Pattern p = Pattern.compile("]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>");Matcher m = p.matcher(html);while(m.find()){//整个img标签System.out.println("img标签-------------"+m.group());//src属性System.out.println("src属性-------------"+m.group(1));}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
输出结果:

img标签-------------
src属性-------------/image/261/1.jpeg
img标签-------------
src属性-------------/image/751/3.jpg
img标签-------------
src属性-------------/image/132/5.jpeg
今天刚接触用jsoup去解析html标签,发现非常方便,比用自己辛辛苦苦去写正则方便多了,正则整个写完,过一段时间再来看这个正则表达式,估计就看不懂了。

下面就介绍用jsoup解析网页:

我截取下面这个网址的部分源代码 
http://domestic.firefox.sina.com/17/0412/08/4OPJ52GTXH0M3V9W.html 
部分源代码

<li><a href="http://domestic.firefox.sina.com/" title="国内">国内a>li><li><a href="http://world.firefox.sina.com/" title="国际">国际a>li><li><a href="http://mil.firefox.sina.com/" title="军事">军事a>li><li><a href="http://photo.firefox.sina.com/" title="图片">图片a>li><li><a href="http://society.firefox.sina.com/" title="社会">社会a>li><li><a href="http://ent.firefox.sina.com/" title="娱乐">娱乐a>li><li><a href="http://tech.firefox.sina.com/" title="科技">科技a>li><li><a href="http://sports.firefox.sina.com/" title="体育">体育a>li><li><a href="http://finance.firefox.sina.com/" title="财经">财经a>li><li><a href="http://auto.firefox.sina.com/" title="汽车">汽车a>li> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
<img src="http://img.firefoxchina.cn/2016/07/1/201607131534240.png" alt="新浪国内">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/crawl/20170412/tUlE-fyecrxv5553275.jpg" alt="衡水中学进浙江引热议 当地校长:办学还是办厂">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/transform/20170412/NCxo-fyecfam0409134.jpg" alt="《奔跑吧兄弟》被指抄袭葫芦娃 被诉索赔200万">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/transform/20170412/QEZ5-fyecfam0405087.jpg" alt="对抗巡视组 他们用特咸饭菜等招数公开挑衅">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/transform/20170412/TfuR-fyecezv3239499.jpg" alt="外媒:中国贸易商接通知退回十多船朝鲜煤炭">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/transform/20170412/eNkL-fyecezv3239189.jpg" alt="中国工资低? 上海最低工资已超部分东欧国家">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/translate/20170412/hPZz-fyecezv3239988.jpg" alt="贵州省副省长慕德贵兼任省委宣传部部长(图)">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/translate/20170412/ufxr-fyecezv3235689.jpg" alt="一则公告让许晴王学兵等明星瞬间蒸发6000多万">
<img src="/static/images/photo.jpg" data-original="http://n.sinaimg.cn/news/crawl/20170412/4DGJ-fyecfam0401539.jpg" alt="武汉留美女生曾亲历美联航驱客:被壮汉架下飞机">
<img src="http://static.firefoxchina.cn/img/201701/7_587834a17cfee0.png">
<img src="http://static.firefoxchina.cn/img/201701/7_5876ea657366d0.png">
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
我们不再用正则表达式去获取这里a标签里的href属性以及img标签里的src属性,而是用jsoup的方法去解析。

到网上下载jsoup的jar包,我分享到百度云盘了:http://pan.baidu.com/s/1jIE7fBS,将jar包添加到我们的项目中。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class TestJsoup {public static void main(String[] args) throws Exception {Document doc = Jsoup.connect("http://domestic.firefox.sina.com/17/0412/08/4OPJ52GTXH0M3V9W.html").get(); //获取 带有src属性的img元素Elements imgTags = doc.select("img[src]");System.out.println("=====imgsTag===="+imgTags);for(Element element:imgTags){String src=element.attr("abs:src");//获取src的绝对路径String src2=element.attr("src");//获取src的绝对路径System.out.println("===src==="+src);System.out.println("===src2==="+src2);}//获取 带有href属性的a元素Elements aTag = doc.select("a[href]");System.out.println("=====aTag===="+aTag);for(Element element :aTag){String href=element.attr("href");System.out.println("===href==="+href);}//所有引用jpg图片的元素 Elements jpgs = doc.select("img[src$=.jpg]");for(Element element :jpgs){String src=element.attr("abs:src");System.out.println("===src==="+src);}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
代码中

     String src=element.attr("abs:src");String src2=element.attr("src");
区别就是前者可以获取到src地址的绝对路径。

Element的attr方法,获取的是属性名为“src”的值,如果我们要像上面的正则表达式一样,将属性名中包含字符串”src”的属性也获取到,但是我们不知道这个包含“src”字符串的属性到底是什么,可能是data-src,也可能是original-src,甚至是其他的,这种情况我们只能变历img标签中的所有属性了。

比如像下面的这种情况,我们获取data-src的属性。

<p><img data-src="http://mmbiz.qpic.cn/mmbiz_jpg/LoyT0npAgkkRjJibID5PXg2zT6iarg9IMkdqpvGv58Fq9tSGUGibZibX2uYfibIryXPuwX44SRjGrY4JURnAvPqvaOQ/0?wx_fmt=jpeg" data-ratio="0.66625" data-w="800" src="http://mmbiz.qpic.cn/mmbiz_jpg/LoyT0npAgkkRjJibID5PXg2zT6iarg9IMkdqpvGv58Fq9tSGUGibZibX2uYfibIryXPuwX44SRjGrY4JURnAvPqvaOQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1" data-fail="0" alt="" />p>
  • 1
可以遍历img标签的属性:

     Document doc = Jsoup.connect("http://domestic.firefox.sina.com/17/0412/08/4OPJ52GTXH0M3V9W.html").get(); //获取 带有src属性的img元素Elements imgTags = doc.select("img[src]");for(Element element:imgTags){Attributes node=element.attributes();Iterator iterator=node.iterator();while (iterator.hasNext()) {Attribute attribute=iterator.next();String key=attribute.getKey();//属性中包含“src”字符串,但不是src的属性if (!key.equals("src")&&key.indexOf("src")!=-1) {//element.removeAttr(key);String  otherSrc=attribute.getValue();System.out.println("====otherSrc===="+otherSrc);break;}}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部