Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android應用開發-小巫CSDN博客客戶端Jsoup篇

Android應用開發-小巫CSDN博客客戶端Jsoup篇

編輯:關於Android編程

Android應用開發-小巫CSDN博客客戶端Jsoup篇
距上一篇博客已經過去了兩個星期,小巫也覺得非常抱歉,因為在忙著做另外一個項目,幾乎抽不出空來,這不小巫會把剩下的博文全部在國慶補上。本篇博客將會給大家介紹如何使用Jsoup這個庫來解析我們的網頁,並且如何對我們想解析的網頁進行分析。 Jsoup這個庫的下載地址:http://jsoup.org/download 筆者這裡使用的jsoup-1.7.2 下載完之後復制到項目中的libs目錄下即可: \ Jsoup的資料比較少,可供參考的可到其官網進行學習這個庫的使用:http://www.open-Z喎?/kf/ware/vc/" target="_blank" class="keylink">vcGVuLmNvbS9qc291cC8JQVBJsunUxLXY1rejumh0dHA6Ly9qc291cC5vcmcvYXBpZG9jcy8JPGJyIC8+CQkJttTV4rj2v+K1xMq508OxytXf0rKyu8rHt8ezo8rsz6SjrL7N1rvKx7zytaWyzr+8wcvOxLW1tvjN6rPJwcu94s72uaTX96Osy/nS1M/Cw+a1xLHK1d+1xL3izva0+sLr0rLWu8rHzOG5qbLOv7yjrL7fzOW1xL3izva3vbeoo6zH68jP1eay6b+0YXBpzsS1taGjCcjnus7KudPDSnNvdXDV4rj2v+Kyu8rH1ti146Os1ti148rHyOe6zrbUztLDx8/rveLO9rXEzfjSs7340NC31s72o6zI57rO1/a1vc/x0tTPwrXE0Ke5+6O6CTxpbWcgc3JjPQ=="/uploadfile/Collfiles/20141002/20141002090903136.png" alt="\" />
這裡可以看到首頁是獲取筆者博客的博文列表,每一個條目都有對應的標題、博文摘要、發布時間、閱讀數、評論數。這些內容就是通過解析首頁html頁面所得到的內容。\

好,就是這樣的一個html頁面,大伙是不是很想把它搬到手機上呢,只要你學會了如何分析html頁面,你可以把任何你想要的內容搬下來,只要你抓取的網頁沒有做防扒取的措施。 筆者使用的浏覽器是Google Chrome,作為專業的IT人士,不用Chrome確實說不過去,按下F12,你就可以看到以下景象,感覺好興奮啊,可以去尋找你想要的寶藏了。是啊,逗比可以往下看了:\ 如果想解析一個網頁,還是得你自己以上面這種方式去看,找到你想要的內容。小巫是這樣做的,可以通過右鍵查看元素,直接查看對應的html源代碼,這樣你就知道內容對應的標簽是什麼了。因為小巫想獲得首頁的所有博文列表,所以我就找到博文的最外層的div標簽開始分析,我找到了id為article_list,然後接著找到了每條博文項的內容,確定下它們的具體的標簽,使用了什麼class,博客可以通過class來獲取你想要的元素,然後取得元素的內容。
直接上代碼吧:
/**
	 * 使用Jsoup解析html文檔
	 * 
	 * @param blogType
	 * @param str
	 * @return
	 */
	public static List getBlogItemList(int blogType, String str) {
		// Log.e("URL---->", str);
		List list = new ArrayList();
		// 獲取文檔對象
		Document doc = Jsoup.parse(str);
		// Log.e("doc--->", doc.toString());
		// 獲取class="article_item"的所有元素
		Elements blogList = doc.getElementsByClass("article_item");
		// Log.e("elements--->", blogList.toString());

		for (Element blogItem : blogList) {
			BlogItem item = new BlogItem();
			String title = blogItem.select("h1").text(); // 得到標題
			// System.out.println("title----->" + title);
			String description = blogItem.select("div.article_description")
					.text();
			// System.out.println("descrition--->" + description);
			String msg = blogItem.select("div.article_manage").text();
			// System.out.println("msg--->" + msg);
			String date = blogItem.getElementsByClass("article_manage").get(0)
					.text();
			// System.out.println("date--->" + date);
			String link = BLOG_URL
					+ blogItem.select("h1").select("a").attr("href");
			// System.out.println("link--->" + link);
			item.setTitle(title);
			item.setMsg(msg);
			item.setContent(description);
			item.setDate(date);
			item.setLink(link);
			item.setType(blogType);

			// 沒有圖片
			item.setImgLink(null);
			list.add(item);

		}
		return list;
	}


小巫通過class="article_item"獲取到所有的元素,也就是Element,然後遍歷所有的元素,把每個元素我們需要的值取出來。我們可以定義一個實體類,比如文章項BlogItem,通過創建不同的BlogItem對象,然後最後添加到list當中,我們就可以把所有博文列表保存下拉,下次取的時候,直接通過list來取即可。
我們可以看到使用Jsoup這個庫,只需要那麼少的代碼就可以輕松獲取到我們想要的內容,編碼、效率啥都有,還等什麼,去用吧。
然後獲取博文詳細內容也是類似的,給定一個url,我們就可以同樣的方式去解析html代碼:
/**
	 * 扒取傳入url地址的博客詳細內容
	 * 
	 * @param url
	 * @param str
	 * @return
	 */
	public static List getContent(String url, String str) {
		List list = new ArrayList();

		// 獲取文檔內容
		Document doc = Jsoup.parse(str);

		// 獲取class="details"的元素
		Element detail = doc.getElementsByClass("details").get(0);
		detail.select("script").remove(); // 刪除每個匹配元素的DOM。

		// 獲取標題
		Element title = detail.getElementsByClass("article_title").get(0);
		Blog blogTitle = new Blog();
		blogTitle.setState(Constants.DEF_BLOG_ITEM_TYPE.TITLE); // 設置狀態
		blogTitle.setContent(ToDBC(title.text())); // 設置標題內容

		// 獲取文章內容
		Element content = detail.select("div.article_content").get(0);

		// 獲取所有標簽為 0) {
				Elements imgs = c.getElementsByTag("img");
				System.out.println("img");
				for (Element img : imgs) {
					if (!img.attr("src").equals("")) {
						Blog blogImgs = new Blog();
						// 大圖鏈接
						if (!img.parent().attr("href").equals("")) {
							blogImgs.setImgLink(img.parent().attr("href"));
							System.out.println("href="
									+ img.parent().attr("href"));
							if (img.parent().parent().tagName().equals("p")) {
								// img.parent().parent().remove();
							}
							img.parent().remove();
						}
						blogImgs.setContent(img.attr("src"));
						blogImgs.setImgLink(img.attr("src"));
						System.out.println(blogImgs.getContent());
						blogImgs.setState(Constants.DEF_BLOG_ITEM_TYPE.IMG);
						list.add(blogImgs);
					}
				}
			}
			c.select("img").remove();

			// 獲取博客內容
			Blog blogContent = new Blog();
			blogContent.setState(Constants.DEF_BLOG_ITEM_TYPE.CONTENT);

			if (c.text().equals("")) {
				continue;
			} else if (c.children().size() == 1) {
				if (c.child(0).tagName().equals("bold")
						|| c.child(0).tagName().equals("span")) {
					if (c.ownText().equals("")) {
						// 小標題,咖啡色
						blogContent
								.setState(Constants.DEF_BLOG_ITEM_TYPE.BOLD_TITLE);
					}
				}
			}

			// 代碼
			if (c.select("pre").attr("name").equals("code")) {
				blogContent.setState(Constants.DEF_BLOG_ITEM_TYPE.CODE);
				blogContent.setContent(ToDBC(c.outerHtml()));
			} else {
				blogContent.setContent(ToDBC(c.outerHtml()));
			}
			list.add(blogContent);
		}

		return list;
	}


獲取評論列表:
/**
	 * 獲取博文評論列表
	 * 
	 * @param str
	 *            json字符串
	 * @return
	 */
	public static List getBlogCommentList(String str, int pageIndex,
			int pageSize) {
		List list = new ArrayList();
		try {
			// 創建一個json對象
			JSONObject jsonObject = new JSONObject(str);
			JSONArray jsonArray = jsonObject.getJSONArray("list"); // 獲取json數組
			int index = 0;
			int len = jsonArray.length();
			BlogCommentActivity.commentCount = String.valueOf(len); // 評論條數
			// 如果評論數大於20
			if (len > 20) {
				index = (pageIndex * pageSize) - 20;
			}

			if (len < pageSize && pageIndex > 1) {
				return list;
			}

			if ((pageIndex * pageSize) < len) {
				len = pageIndex * pageSize;
			}

			for (int i = index; i < len; i++) {
				JSONObject item = jsonArray.getJSONObject(i);
				String commentId = item.getString("CommentId");
				String content = item.getString("Content");
				String username = item.getString("UserName");
				String parentId = item.getString("ParentId");
				String postTime = item.getString("PostTime");
				String userface = item.getString("Userface");

				Comment comment = new Comment();
				comment.setCommentId(commentId);
				comment.setContent(content);
				comment.setUsername(username);
				comment.setParentId(parentId);
				comment.setPostTime(postTime);
				comment.setUserface(userface);

				if (parentId.equals("0")) {
					// 如果parentId為0的話,表示它是評論的topic
					comment.setType(Constants.DEF_COMMENT_TYPE.PARENT);
				} else {
					comment.setType(Constants.DEF_COMMENT_TYPE.CHILD);
				}
				list.add(comment);
			}

		} catch (JSONException e) {
			e.printStackTrace();
		}
		return list;
	}


具體使用細節可以參考筆者提供的源碼:http://download.csdn.net/detail/wwj_748/7912513
小巫已經把解析html的思路告訴大家啦,剩下如何來學習jsoup這個庫解析html就靠你們自己去做了。下一篇博客預告,集成友盟社會化組件,詳細給大家介紹如何集成友盟提供的社會化組件SDK。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved