【Jsoup爬取网页内容】

思路:根据给定URL分析其源码,得到所需的网页内容的位置,制定规则采集或下载之

采集的图片和文字示例:

tags:
tag:brazil
tag:dog
tag:pet
tag:pointyfaceddog
tag:Pets Around the World
imageUrl:http://farm2.staticflickr.com/1241/1050065123_9739d1283a_z.jpg


[java]  view plain  copy
  1. import java.io.BufferedWriter;  
  2. import java.io.File;  
  3. import java.io.FileOutputStream;  
  4. import java.io.FileWriter;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.net.URL;  
  8. import java.net.URLConnection;  
  9.   
  10. import org.jsoup.*;  
  11. import org.jsoup.nodes.Document;  
  12. import org.jsoup.nodes.Element;  
  13. import org.jsoup.select.Elements;  
  14. /** 
  15.  * @author ZTX 
  16.  * jsoup下载测试 
  17.  */  
  18. public class TestSoup {  
  19.   //待采集网址  
  20.     private static String url = "http://www.flickr.com/photos/9339954@N03/1050065123/in/photolist-2AMRM6-3JesJx-4n7zTL-4sVi7P-4t3yt6-4Ay5SR-4SV4Dz-57LhgB-5g78Rp-5huiYa-5jmQqP-5qawPz-5qaAFP-5qeRNy-5qf2gd-5qfdSQ-5qfe33-5qfKSf-5wYskN-5XxHra-5YcEX1-64zW7q-66U2Lp-67nNta-6aJgvN-6eFSCL-6fiVqR-6ghPXc-6nFAhA-6oZZso-6uQTsi-6vizoJ-6Dpn3e-6EuENc-6QK6TG-6Z4BBW-7347jr-7347nt-7347ra-7347ta-754FLt-78SRmT-7jdxPt-7vNc4q-h3h9sV-9JA3zQ-h3oJ39-h3gL6w-hrN3DF-ek7Tkt-9JA8ns";  
  21.   //采集的图片存放路径  
  22.     private static String imgPath = "./download/img.jpg";  
  23.       
  24.     public static void main(String []args){  
  25.         // 采集和下载  
  26.      getHTML(url);  
  27.      downloadImg(getFlickrImgUrl(url),imgPath);  
  28.     }  
  29.   
  30.     /** 
  31.      * @param url 
  32.      * 根据网址采集网页HTML文字内容 
  33.      */  
  34.     private static void getHTML(String url) {  
  35.     // 使用jsoup选择器语法,链接传递过来的url,并赋值给Document  
  36.         Document doc;  
  37.     try {  
  38.         doc = Jsoup.connect(url).get();  
  39.         Element tagsUL = doc.getElementById("thetags");//tags ul  
  40.         Elements tags =tagsUL.getElementsByTag("li");  
  41.         System.out.println("tags:");    
  42.         for(Element i:tags) {    
  43.                  String tag=i.tagName();    
  44.                  System.out.println("tag:"+i.text());    
  45.         }   
  46.     } catch (IOException e) {  
  47.         e.printStackTrace();  
  48.     }  
  49.   
  50.     }  
  51.   
  52.     /** 
  53.      * 根据图片网址下载图片 
  54.      * 2013-12-15 20:41:54 
  55.      * @param realurl 
  56.      */  
  57.     private static void downloadImg(String imageUrl,String imgPath) {  
  58.     try {  
  59.         //下载  
  60.         URL   downloadUrl   =   new   URL( imageUrl);   
  61.         URLConnection   uc   =   downloadUrl.openConnection();   
  62.         InputStream   is   =   uc.getInputStream();   
  63.         File   file   =   new   File( imgPath);   
  64.         FileOutputStream   out   =   new   FileOutputStream(file);   
  65.         int   i=0;   
  66.         while   ((i=is.read())!=-1)   {   
  67.         out.write(i);   
  68.         }   
  69.         is.close();  
  70.     } catch (IOException e) {  
  71.         e.printStackTrace();  
  72.     }  
  73.     }  
  74.   
  75.     /** 
  76.      * 根据网址得到图片URL 
  77.      * 2013-12-15 20:41:17 
  78.      * @param url 
  79.      * @return 
  80.      * @throws IOException 
  81.      */  
  82.     private static String getFlickrImgUrl(String url) {  
  83.     Document doc = null;  
  84.     try {  
  85.         doc = Jsoup.connect(url).get();  
  86.     } catch (IOException e) {  
  87.         e.printStackTrace();  
  88.     }  
  89.     String imageUrl = doc  
  90.         .getElementById("main-photo-container")  
  91.         .getElementsByTag("img")  
  92.         .first()  
  93.         .absUrl("src");  
  94.     System.out.println("imageUrl:"+imageUrl);  
  95.     return imageUrl;  
  96.     }  
  97. }  

jsoup解析有很多种方法能得到同样的结构,就看你想用哪种思路。
有用id定位的  有用tagname获取的 有用class 获取的  






常用的方法如下:
jsoup提供类似JS获取html元素:
getElementById(String id) 用id获得元素
getElementsByTag(String tag) 用标签获得元素
getElementsByClass(String className) 用class获得元素
getElementsByAttribute(String key)  用属性获得元素
同时还提供下面的方法提供获取兄弟节点:siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()




获得与设置元素的数据
attr(String key)  获得元素的数据 attr(String key, String value) 设置元素数据 
attributes() 获得所以属性
id(), className()  classNames() 获得id class得值
text()获得文本值
text(String value) 设置文本值
html() 获取html 
html(String value)设置html
outerHtml() 获得内部html
data()获得数据内容
tag()  获得tag 和 tagName() 获得tagname 




操作html元素:
append(String html), prepend(String html)
appendText(String text), prependText(String text)
appendElement(String tagName), prependElement(String tagName)
html(String value)




jsoup还提供了类似于JQuery方式的选择器
采用选择器来检索数据
tagname 使用标签名来定位,例如 a 
ns|tag     使用命名空间的标签定位,例如 fb:name 来查找 <fb:name> 元素 
#id     使用元素 id 定位,例如 #logo 
.class     使用元素的 class 属性定位,例如 .head 
*     定位所有元素 
[attribute] 使用元素的属性进行定位,例如 [href] 表示检索具有 href 属性的所有元素 
[^attr] 使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5 的 dataset 属性 
[attr=value]使用属性值进行定位,例如 [width=500] 定位所有 width 属性值为 500 的元素 
[attr^=value],[attr$=value],[attr*=value] 这三个语法分别代表,属性以 value 开头、结尾以及包含 
[attr~=regex]使用正则表达式进行属性值的过滤,例如 img[src~=(?i)\.(png|jpe?g)] 
以上是最基本的选择器语法,这些语法也可以组合起来使用




组合用法
el#id      定位id值某个元素,例如 a#logo -> <a id=logo href= … > 
el.class 定位 class 为指定值的元素,例如 div.head -> <div class=head>xxxx</div> 
el[attr] 定位所有定义了某属性的元素,例如 a[href] 
以上三个任意组合     例如 a[href]#logo 、a[name].outerlink 




除了一些基本的语法以及这些语法进行组合外,jsoup 还支持使用表达式进行元素过滤选择
:lt(n)     例如 td:lt(3) 表示小于三列 
:gt(n)     div p:gt(2) 表示 div 中包含 2 个以上的 p 
:eq(n)     form input:eq(1) 表示只包含一个 input 的表单 
:has(seletor)     div:has(p) 表示包含了 p 元素的 div 
:not(selector)     div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表 
:contains(text)     包含某文本的元素,不区分大小写,例如 p:contains(oschina) 
:containsOwn(text)     文本信息完全等于指定条件的过滤 
:matches(regex)     使用正则表达式进行文本过滤:div:matches((?i)login) 
:matchesOwn(regex)     使用正则表达式找到自身的文本

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值