package com.yaoyumeng.v2ex.model; import android.util.Log; import com.yaoyumeng.v2ex.utils.ContentUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.regex.Pattern; /** * 话题列表类,网页解析得到 * Created by yw on 2015/5/19. */ public class TopicListModel extends ArrayList<TopicModel> { private static final long serialVersionUID = 2015050107L; public int mCurrentPage = 1; public int mTotalPage = 1; public void parse(String responseBody) throws Exception { Document doc = Jsoup.parse(responseBody); Element body = doc.body(); Elements elements = body.getElementsByAttributeValue("class", "cell item"); for (Element el : elements) { try { TopicModel model = parseTopicModel(el, true, null); add(model); } catch (Exception e) { } } int[] pages = ContentUtils.parsePage(body); mCurrentPage = pages[0]; mTotalPage = pages[1]; } public void parseFromNodeEntry(String responseBody, String nodeName) throws Exception { Document doc = Jsoup.parse(responseBody); String title = doc.title(); title = title.replace("V2EX ›", "").trim(); title = title.split(" ")[0]; NodeModel node = new NodeModel(); node.name = nodeName; node.title = title; Element body = doc.body(); //Elements elements = body.getElementsByAttributeValue("id", "TopicsNode"); //if(elements.size() != 1) return; Elements elements = body.getElementsByAttributeValueMatching("class", Pattern.compile("cell from_(.*)")); for (Element el : elements) { try { TopicModel topic = parseTopicModel(el, false, node); add(topic); } catch (Exception e) { Log.e("err", e.toString()); } } int[] pages = ContentUtils.parsePage(body); mCurrentPage = pages[0]; mTotalPage = pages[1]; } private TopicModel parseTopicModel(Element el, boolean parseNode, NodeModel node) throws Exception { Elements tdNodes = el.getElementsByTag("td"); TopicModel topic = new TopicModel(); MemberModel member = new MemberModel(); if (parseNode) node = new NodeModel(); for (Element tdNode : tdNodes) { String content = tdNode.toString(); if (content.contains("class=\"avatar\"") ) { Elements userIdNode = tdNode.getElementsByTag("a"); if (userIdNode != null) { String idUrlString = userIdNode.attr("href"); member.username = idUrlString.replace("/member/", ""); } Elements avatarNode = tdNode.getElementsByTag("img"); if (avatarNode != null) { String avatarString = avatarNode.attr("src"); if (avatarString.startsWith("//")) { avatarString = "http:" + avatarString; } member.avatar = avatarString; } } else if (content.contains("class=\"item_title\"") ) { Elements aNodes = tdNode.getElementsByTag("a"); for (Element aNode : aNodes) { if (parseNode && aNode.attr("class").equals("node")) { String nodeUrlString = aNode.attr("href"); node.name = nodeUrlString.replace("/go/", ""); node.title = aNode.text(); } else { if (aNode.toString().contains("reply") ) { topic.title = aNode.text(); String topicIdString = aNode.attr("href"); String[] subArray = topicIdString.split("#"); topic.id = Integer.parseInt(subArray[0].replace("/t/", "")); topic.replies = Integer.parseInt(subArray[1].replace("reply", "")); } } } Elements spanNodes = tdNode.getElementsByTag("span"); for (Element spanNode : spanNodes) { String contentString = spanNode.text(); if (contentString.contains("最后回复") || contentString.contains("前") || contentString.contains("  •  ") ) { String[] components = contentString.split("  •  "); if (parseNode && components.length <= 2) continue; else if (!parseNode && components.length <= 1) continue; String dateString = parseNode ? components[2] : components[1]; long created = System.currentTimeMillis() / 1000; String[] stringArray = dateString.split(" "); if (stringArray.length > 1) { String unitString = ""; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = sdf.parse(dateString); created = date.getTime() / 1000; topic.created = created; break; } catch (Exception e) { } int how = Integer.parseInt(stringArray[0]); String subString = stringArray[1].substring(0, 1); if (subString.equals("分")) { unitString = "分钟前"; created -= 60 * how; } else if (subString.equals("小")) { unitString = "小时前"; created -= 3600 * how; } else if (subString.equals("天")) { created -= 24 * 3600 * how; unitString = "天前"; } dateString = String.format("%s%s", stringArray[0], unitString); } else { dateString = "刚刚"; } topic.created = created; } else { topic.created = -1; } } } } topic.member = member; topic.node = node; return topic; } }