下面以http://news.csdn.net/news.html为爬虫示例网站进行分析,F12查看网页布局,效果如下:
从图中分析知,待扒的单个数据以unit为标签,即一个unit标签对应一个对象。
下面定义Jsoup帮助类,getRootElements()返回需要解析的对象的根标签,这里需要返回document.getElementsByClass("unit")。
anaylizeRootElement(Element rootElemen)方法中将指定的rootElemen解析成需要的对象。
package com.coca.android_unity_lab.joke; import com.coca.unity_dev_utils.android.log.UtilsLog;import com.coca.unity_dev_utils.android.log.UtilsLogFactory;import com.coca.unity_dev_utils.java.UtilsCollections; import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements; import java.util.List; /** * Created by Administrator on 2016/6/16. */public abstract class JsoupHelper { private static final UtilsLog lg = UtilsLogFactory.getLogger(JsoupHelper.class); private Document document; public JsoupHelper setDocument(Document document) { this.document = document; return this; } public void startAnaylizeByJsoup() { Elements rootElements = getRootElements(document); lg.e("开始使用Jsoup分析数据:analizeJsoup,共有数据量:" + rootElements.size()); for (Element rootElement : rootElements) { anaylizeRootElement(rootElement); } } /** * 获取解析的根目录集合 * * @param document * @return */ public abstract Elements getRootElements(Document document); /** * 根据每个根布局生成对应的java对象 * * @param rootElement * @return */ public abstract void anaylizeRootElement(Element rootElement);}
具体使用方式如下:
jsoupHelper = new JsoupHelper() { @Override public Elements getRootElements(Document document) { return document.getElementsByClass("unit"); } @Override public void anaylizeRootElement(Element rootElement) { JokeAdapterEntity entity = new JokeAdapterEntity(); Element contentElement = JsoupHelper.paraseElement(rootElement, UtilsCollections.createListThroughMulitParamters("h1", "a")); entity.setContent(contentElement.text()); Element imageElement = JsoupHelper.paraseElement(rootElement, UtilsCollections.createListThroughMulitParamters("dl", "dt", "a", "img")); if (imageElement != null) { lg.e("捕获到的数据:" + imageElement.attr("src")); entity.setImgUrl(imageElement.attr("src")); } adapter.addDataResource(0, entity); }};
调用方式如下,
jsoupHelper.setDocument(Jsoup.parse(response)).startAnaylizeByJsoup();
下面给出递归搜索至指定标签的方法:
/** * 递归解析标签 * @param element * @param tags 标签的依次搜索规则 * @return */public static Element paraseElement(Element element, List<String> tags) { if (UtilsCollections.isCollectionNotEmpty(tags)) { String parseTag = tags.get(0); Elements elements = element.getElementsByTag(parseTag); boolean isElementsNotEmpty = elements != null && elements.size() > 0; lg.e("解析标签:" + parseTag + ",Size is " + (isElementsNotEmpty ? elements.size() : 0)); if (isElementsNotEmpty) { return paraseElement(elements.first(), tags.subList(1, tags.size())); } else { lg.e("该标签下的Element集合为空,return null"); return null; } } else { lg.e("找到指定元素"); return element; }}
时间: 2024-11-05 02:17:41