一,身为安卓开发人员,在没有接口的情况下是很操蛋的。索性就抓点数据测试用了。
准备工作:jsoup.jar
这里 已经 是 已经实现好 逻辑的方法。
public class MianHuanJsoup {
public static final String MH_URL_WWW="http://www.cncotton.com/";//中国棉花网,
/**
* 请求棉花最新 新闻列表
* @param url
*/
public static List<MianHuaNewsInfo> getMiaHuaListTitle(String url){
List<MianHuaNewsInfo> mhList=new ArrayList<>();
try {
//加载HTML
Document document= Jsoup.connect(url).get();
//获取指定 选择器中的数据
Element div1 = document.getElementsByAttributeValue("class", "main4").first();
//这个网页存在多个main4 所以 要先查到属于谁下面的,再查。
Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first();
Elements lis=div2.select("li");//2
Elements links = lis.select("a[href]");
MianHuaNewsInfo mh;//每个标题算一个对象。
for (int i = 0; i <links.size() ; i++) {
mh=new MianHuaNewsInfo();
mh.setTitle(links.get(i).text());//标题名字
mh.setUrl(url+links.get(i).attr("href"));//连接
// mh.setTimes(TimeUtils.getStr(links.get(i).attr("href")));//剪切时间。
mhList.add(mh);
// getMianHuaContext(mhList.get(i).getUrl());
// System.out.println("时间 : " + mhList.get(i).getTimes()+mhList.get(i).getUrl());//标题名字
OkLogger.e("biaoti--- : " + links.get(i).text());//标题名字
OkLogger.e("111111111--- : " + mhList.get(i).getTitle());//标题名字
}
// for (Element link : links) {
// System.out.println("\nlink : "+url + link.attr("href"));
// System.out.println("text : " + link.text());//标题名字
//
// }
} catch (IOException e) {
e.printStackTrace();
}
return mhList;
}
/**
* 获取每个标题下面的详细信息
* @param url
*/
public static List<MHNewsContextInfo> getMianHuaContext(String url){
List<MHNewsContextInfo> mhList = new ArrayList<>();
MHNewsContextInfo mh=new MHNewsContextInfo();
try {
Document doc= Jsoup.connect(url).get();
//需要哪一块的数据。只有图片就用这个
Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first();
//如果 有段落就用这个。
Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first();
//TODO: 由于数据结构的不一致性,此处判空
Elements p_null=doc.getElementsByTag("p");
Elements img_null=doc.getElementsByTag("img");
if (!img_null.isEmpty()){
//数组
for (int i = 0; i <img_null.size() ; i++) {
mh.setImgUrl(img_null.get(i).attr("src"));
if (null!=mh) {
mhList.add(mh);
}
}
// for (Element img : div_imgs) {
// System.out.print("---path:" +img.attr("src"));
// }
}
if (!p_null.isEmpty()){
//段落的数据
Elements p = p_null.select("p");//段落
if (null!=p){
for (int i = 0; i <p.size() ; i++) {
mh.setStrContext(p.get(i).select("p").text());
if (null!=mh) {
mhList.add(mh);
}
}
// for (Element ets:p) {
// System.out.println("\n : "+ ets.select("p").text());
// }
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.print("---棉花详情抓取出错:");
}
return mhList;
}
}
这里写代码片
这是我的实体类
public class MianHuaNewsInfo {
private String title;//文章标题
private String url;//文章详情链接。
private String name="--";//发布者
private String times;//时间
public boolean read=false;//是否已读 true 读 , 默认未读
/**
* 放详情内容。
*/
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTimes() {
//时间就等于,详情链接中的 时间,这里截取,
times=TimeUtils.getStr(url);
return times;
}
public void setTimes(String times) {
this.times = times;
}
}
这里主要是测试类。建议从这里看 思路会清晰些
package ctp.pdz.cropstradingplatform;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import java.io.IOException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import static ctp.pdz.cropstradingplatform.jsoup.MianHuanJsoup.getMiaHuaListTitle;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
private String url="http://www.cncotton.com/";//棉花
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
getMiaHuaListTitle_test(url);
}
//抓取棉花网最新资讯标题及路径
public void getMiaHuaListTitle_test(String url){
try {
//加载HTML
Document document= Jsoup.connect(url).get();
//获取指定 选择器中的数据
Element div1 = document.getElementsByAttributeValue("class", "main4").first();
//这个网页存在多个main4 所以 要先查到属于谁下面的,再查。
Element div2 = div1.getElementsByAttributeValue("class", "main4_mm_t2").first();
Elements lis=div2.select("li");//2
Elements links = lis.select("a[href]");
for (Element link : links) {
System.out.println("\nlink : "+url + link.attr("href"));
System.out.println("text : " + link.text());
}
/// zmjgdatayep_13
Element time=document.getElementById("zmjgdatayep_13");
System.out.println("text : " + time);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取标题下面的详情
public void getMianHuaContext_test(String url){
try {
Document doc= Jsoup.connect(url).get();
//需要哪一块的数据。只有图片就用这个
Element div_all= doc.getElementsByAttributeValue("class", "TRS_Editor").first();
//如果 有段落就用这个。
Element div_p= div_all.getElementsByAttributeValue("class", "TRS_PreAppend").first();
//TODO: 由于数据结构的不一致性,此处判空
Elements p_null=doc.getElementsByTag("p");
Elements img_null=doc.getElementsByTag("img");
if (!img_null.isEmpty()){
//图片的数据
Elements div_imgs = div_all.getElementsByTag("img");//图片。
for (Element img : div_imgs) {
System.out.print("---path:" + img.attr("src"));
}
}
if (!p_null.isEmpty()){
//段落的数据
Elements p = div_p.select("p");//段落
if (null!=p){
for (Element ets:p) {
System.out.println("\n : "+ ets.select("p").text());
}
}
}
} catch (IOException e) {
e.printStackTrace();
System.out.print("---棉花详情抓取出错:");
}
}
//获取价格表单
public void getFrom(){
/// 新疆 部分收购价格--http://dc.cncotton.com/dc/data/XJMData.action
//籽棉价格 ---http://dc.cncotton.com/dc/data/ZMData.action
}
/**
* 截取 把20171121 ☞ 2017-11-21
*
* */
public static void getStr(String url){
String userNameUrl="./sy_59/gnmh_1388/rdxw/201711/t20171121_575890.html";
int beginIndex = 0;
int endIndex = 0;
beginIndex = userNameUrl.indexOf("/t")+1;
endIndex = userNameUrl.lastIndexOf("_");
String t=userNameUrl.substring(beginIndex,endIndex);
String a=t.substring(1,5);//0 开始,后面不截取
String b=t.substring(5,7);
String c=t.substring(7);
System.out.println("--a:"+a+"--b:"+b+"--c"+c);
}
}
第一个 方法获取标题,和路径。这里还抓不到内容。
运行 getMiaHuaListTitle_test();
这个方法结果如下:
再运行getMianHuaContext_test()
方法,取得这条路径下面的详细内容。