Java操作Html文檔利器---Jsoup

jopen 12年前發布 | 78K 次閱讀 HTML操作類庫 jsoup

一、Jsoup是蝦米東西了?這個不解釋,給你列個場景你就知道,比喻你現在想通過java代碼從www.baidu.com上獲取百度icom的url,怎么辦了?就必須得對html文檔元素進行操作了。對!!Jsoup就是java中用來操作html文檔的一個第三方類庫。

 

二、Why Jsoup?用過Jquery的都知道,Jquery簡單的語法超強的功能,讓人用了就愛不釋手,而Jsoup的用法就是使用類Jquery的用法,所以會jQuery的話,稍微看一下文檔就會使用Jsoup了。

 

三、具體應用


    上面羅里吧嗦的簡單介紹了一下jsoup,現在簡單介紹一下在生產環境中的具體應用。小弟最近遇到的一個需求是通過iTunesId到蘋果的網站上去獲取這個應用的Icon和描述圖片。具體的思路是:
1、從Jsoup的官方網站下載jsoup的jar,最新的版本為1.6.3,并且這個包是無依賴包,不需要和其他的jar包配合使用
2、加載文檔
3、查找icon元素獲取的地址
4、獲取描述圖片的元素并取得地址
業務并不復雜,貼一下代碼,注釋還算清楚。
package com.akwolf.quartz;

import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List;

import org.apache.log4j.Logger; import org.jdom.CDATA; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;

public class AppleJob implements Job {

private static Logger logger = Logger.getLogger(AppleJob.class);

public static void main(String[] args) {
    AppleJob aj = new AppleJob();
    try {
        String itunesId = "444934666";
        try {
            Document doc = aj.getHtmlDoc(itunesId);
            logger.debug("itunesId : " + itunesId + " , doc : ");
            // 如果不是一個有效的鏈接
            if (doc == null || !aj.isCorrectItunesId(doc)) {
                throw new IOException();
            }
            String params = aj.getProParameter(aj.getIconUrl(doc),
                    aj.getDescImgUrl(doc));
            logger.debug("params : " + params);

        } catch (IOException e) {
            logger.warn("Can't connect to : " + itunesId);
        }
    } catch (Exception e) {
        e.printStackTrace();
        logger.warn("Has some Exception!!!");
    }
}

@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
    try {
        String itunesId = "444934666";
        try {
            Document doc = this.getHtmlDoc(itunesId);
            logger.debug("itunesId : " + itunesId + " , doc : ");
            // 如果不是一個有效的鏈接
            if (doc == null || !isCorrectItunesId(doc)) {
                throw new IOException();
            }
            String params = this.getProParameter(this.getIconUrl(doc),
                    this.getDescImgUrl(doc));
            logger.debug("params : " + params);

        } catch (IOException e) {
            logger.warn("Can't connect to : " + itunesId);
        }
    } catch (Exception e) {
        e.printStackTrace();
        logger.warn("Has some Exception!!!");
        JobExecutionException jee = new JobExecutionException(e);
        jee.refireImmediately();
    }
}

/**
 * 
 * 判斷是否是一個有效的連接
 * 
 * @param doc
 * @return
 */
private boolean isCorrectItunesId(Document doc) {
    Elements footer = doc.select("p.footer");
    if (footer == null || footer.size() == 0) {
        return true;
    }
    return (!"http://www.apple.com.cn/itunes/download/".equals(footer
            .first().select("a").first().absUrl("href")));
}

/**
 * @param iconUrl
 * @param descImgUrl
 * @return
 * @throws IOException
 * 
 * 
 *             拼裝出存儲過程的參數
 */
private String getProParameter(String iconUrl, List<String> descImgUrl)
        throws IOException {
    StringBuffer buffer = new StringBuffer();
    org.jdom.Element root = new org.jdom.Element("params");
    org.jdom.Document doc = new org.jdom.Document(root);
    org.jdom.Element icon = new org.jdom.Element("IconUrl");
    org.jdom.Element desc = new org.jdom.Element("DescUrl");
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    for (int i = 0; i < descImgUrl.size(); i++) {
        if (i == descImgUrl.size() - 1) {
            buffer.append(descImgUrl.get(i));
        } else {
            buffer.append(descImgUrl.get(i)).append(",");
        }
    }
    icon.addContent(new CDATA(iconUrl));
    desc.addContent(new CDATA(buffer.toString()));
    root.addContent(icon).addContent(desc);

    Format format = Format.getRawFormat();
    format.setOmitDeclaration(true);
    XMLOutputter writer = new XMLOutputter(format);
    writer.output(doc, out);
    return out.toString();
}

/**
 * @param itunesId
 * @return
 * @throws IOException
 * 
 *             取得html文檔
 */
private Document getHtmlDoc(String itunesId) throws IOException {
    Document doc = Jsoup.connect(
            "http://itunes.apple.com/cn/app/id" + itunesId).get();
    return doc;
}

/**
 * @param doc
 * @return
 * 
 *         解析出app的icon圖片
 */
private String getIconUrl(Document doc) {
    Element img = doc.select("#left-stack").first().select("img").first();
    String src = img.attr("abs:src");
    return src;
}

/**
 * @param doc
 * @return
 * 
 *         解析出描述圖片的url
 */
private List<String> getDescImgUrl(Document doc) {
    List<String> list = new ArrayList<String>();
    Elements wrapper = doc.select("div.center-stack").first()
            .select("img.portrait");
    for (Element element : wrapper) {
        list.add(element.attr("abs:src"));
    }
    return list;
}

}</pre>結果

26 [main] DEBUG com.akwolf.quartz.AppleJob (2012-09-23 10:50:12,136) - params : <params><IconUrl><![CDATA[http://a3.mzstatic.com/us/r1000/104/Purple/v4/bb/71/3a/bb713a76-5492-9456-5114-63c19582b3c3/mza_297600500225037689.175x175-75.jpg]]></IconUrl><DescUrl><![CDATA[http://a5.mzstatic.com/us/r1000/080/Purple/v4/05/d6/d9/05d6d9d0-686f-63ad-7713-34b5b5aaea7f/mza_2616996279428462004.320x480-75.jpg,http://a2.mzstatic.com/us/r1000/067/Purple/v4/4d/9e/97/4d9e97ea-8367-764d-fceb-e607f55bf847/mza_7946357603060756898.320x480-75.jpg,http://a2.mzstatic.com/us/r1000/071/Purple/v4/21/7a/45/217a4551-d1b1-27e5-3a15-dec47a136069/mza_6366124751766881957.320x480-75.jpg,http://a5.mzstatic.com/us/r1000/065/Purple/v4/7b/5b/ad/7b5badf9-73ba-dd72-4dc9-95a671aa1306/mza_7359786108776115754.320x480-75.jpg,http://a4.mzstatic.com/us/r1000/112/Purple/v4/b7/19/25/b71925c1-a2a7-c69d-fd9c-d3368d0fb1b5/mza_8201700535726140806.320x480-75.jpg]]></DescUrl></params>
來自:http://blog.csdn.net/akwolf/article/details/8009226

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!