Jsoup实现网络数据抓取2

来源:互联网 发布:php static 编辑:程序博客网 时间:2024/06/05 09:59

使用Jsoup工具解析数据,Jsoup采用的DOM进行解析数据的,总体是比较简单,根据各个元素的attr,class以及继承关系,就可以访问到需要的数据。

代码如下:

(1)SecondActivity代码

public class SecondActivity extends Activity{    List<DataHolder> dataHolders = new ArrayList<>();    ListView listView;    Adapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.second_activity);        init();    }    private void init()    {        Intent intent = getIntent();        String date = intent.getStringExtra("extra_date");        try        {            new AsynLoad().execute(new URL("http://rili.jin10.com/" + date));        }        catch (MalformedURLException e)        {            e.printStackTrace();        }        Log.d("de" , dataHolders.toString());    }    class AsynLoad extends AsyncTask<URL , Void , String>    {        @Override        protected String doInBackground(URL... urls)        {            StringBuilder sb = new StringBuilder();            try            {                URL url = urls[0];                HttpURLConnection conn = (HttpURLConnection) url.openConnection();                conn.setConnectTimeout(5 * 1000);                conn.setRequestMethod("GET");                conn.setRequestProperty(                        "Accept",                        "image/gif, image/jpeg, image/pjpeg, image/pjpeg, "                                + "application/x-shockwave-flash, application/xaml+xml, "                                + "application/vnd.ms-xpsdocument, application/x-ms-xbap, "                                + "application/x-ms-application, application/vnd.ms-excel, "                                + "application/vnd.ms-powerpoint, application/msword, */*");                conn.setRequestProperty("Accept-Language", "zh-CN");                conn.setRequestProperty("Charset", "UTF-8");                conn.setRequestProperty("Connection", "Keep-Alive");                InputStream is = conn.getInputStream();                int len = 0;                byte[] buf = new byte[1024];                while ((len = is.read(buf)) > 0)                {                    sb.append(new String(buf , 0 , len , "UTF-8"));                }                is.close();            }            catch (Exception e)            {                e.printStackTrace();            }            return sb.toString();        }        @Override protected void onPostExecute(String result)        {            Document doc = Jsoup.parse(result);            Element importantTime = null;            Elements td_rowspan = doc.getElementsByAttribute("rowspan");            for (int i = 0 ; i < td_rowspan.size() ; i++)            {                if (td_rowspan.get(i).text().equals("22:30") || td_rowspan.get(i).text().equals("23:30"))                {                    importantTime = td_rowspan.get(i);                }            }            if (importantTime != null)            {                Element parent = importantTime.parent();                DataHolder dataHolder1 = new DataHolder();                dataHolder1.setName(parent.child(2).text());                dataHolder1.setLastData(parent.child(4).text());                dataHolder1.setPreData(parent.child(5).text());                dataHolder1.setPostData(parent.child(6).child(0).text());                dataHolder1.setInfluent(parent.child(7).child(0).child(0).text() + " " + parent.child(7).child(0).child(1).text());                dataHolders.add(dataHolder1);                Element currentElement = parent.nextElementSibling();                int count = 0;                while (currentElement != null)                {                    if (count == 0 || count >3)                    {                        count++;                        currentElement = currentElement.nextElementSibling();                    }                    else                    {                        DataHolder dataHolder = new DataHolder();                        dataHolder.setName(currentElement.child(0).text());                        dataHolder.setLastData(currentElement.child(2).text());                        dataHolder.setPreData(currentElement.child(3).text());                        dataHolder.setPostData(currentElement.child(4).child(0).text());                        dataHolder.setInfluent(currentElement.child(5).child(0).child(0).text() + " "                                + currentElement.child(5).child(0).child(1).text());                        dataHolders.add(dataHolder);                        currentElement = currentElement.nextElementSibling();                        count++;                    }                }                listView = (ListView) findViewById(R.id.id_list);                adapter = new Adapter(SecondActivity.this , dataHolders);                listView.setAdapter(adapter);            }        }    }}

(2)Bean类:

public class DataHolder{    private String name;    private String lastData;    private String preData;    private String postData;    private String influent;    public DataHolder()    {    }    public DataHolder(String name , String lastData , String preData , String postData , String influent)    {        this.name = name;        this.lastData = lastData;        this.preData = preData;        this.postData = postData;        this.influent = influent;    }    public String getName() {        return name;    }    public String getPreData() {        return preData;    }    public String getLastData() {        return lastData;    }    public String getPostData() {        return postData;    }    public String getInfluent() {        return influent;    }    public void setName(String name) {        this.name = name;    }    public void setLastData(String lastData) {        this.lastData = lastData;    }    public void setPreData(String preData) {        this.preData = preData;    }    public void setPostData(String postData) {        this.postData = postData;    }    public void setInfluent(String influent) {        this.influent = influent;    }}

(3)Adapter类:

public class Adapter extends BaseAdapter{    private List<DataHolder> datas;    private LayoutInflater inflater;    public Adapter(Context context , List<DataHolder> myDatas)    {        inflater = LayoutInflater.from(context);        datas = myDatas;    }    @Override    public int getCount()    {        return datas.size();    }    @Override    public Object getItem(int position)    {        return datas.get(position);    }    @Override    public long getItemId(int position)    {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent)    {        ViewHolder viewHolder = null;        if (convertView == null)        {            convertView = inflater.inflate(R.layout.list_item2 , null);            viewHolder = new ViewHolder();            viewHolder.name = (TextView) convertView.findViewById(R.id.name);            viewHolder.lastData = (TextView) convertView.findViewById(R.id.last_data);            viewHolder.preData = (TextView) convertView.findViewById(R.id.pre_data);            viewHolder.postData = (TextView) convertView.findViewById(R.id.post_data);            viewHolder.influent = (TextView) convertView.findViewById(R.id.info_data);            convertView.setTag(viewHolder);        }        else        {            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.name.setText(datas.get(position).getName());        viewHolder.lastData.setText("前值:" + datas.get(position).getLastData());        viewHolder.preData.setText("预测值:" + datas.get(position).getPreData());        viewHolder.postData.setText("公布值:" + datas.get(position).getPostData());        viewHolder.influent.setText(datas.get(position).getInfluent());        if (datas.get(position).getInfluent().equals("利空 金银"))        {            viewHolder.influent.setTextColor(Color.GREEN);            viewHolder.influent.setBackgroundResource(R.drawable.text_style);        }        else        {            viewHolder.influent.setTextColor(Color.RED);            viewHolder.influent.setBackgroundResource(R.drawable.text_style2);        }        return convertView;    }    class ViewHolder    {        TextView name;        TextView lastData;        TextView preData;        TextView postData;        TextView influent;    }}

主页面布局比较简单,这里只贴出item的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="60dp">    <TextView        android:id="@+id/name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginLeft="3dp"        android:layout_marginTop="5dp"        android:layout_marginBottom="5dp"        android:textSize="15sp"        android:text=""/>    <LinearLayout        android:layout_width="match_parent"        android:orientation="horizontal"        android:layout_height="wrap_content"        android:layout_marginTop="1dp"        android:layout_marginLeft="5dp"        android:layout_below="@+id/name">        <TextView            android:id="@+id/last_data"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text=""            android:textSize="12sp"/>        <TextView            android:id="@+id/pre_data"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:text=""            android:textSize="12sp"/>        <TextView            android:id="@+id/post_data"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:layout_marginLeft="5dp"            android:text=""            android:textSize="12sp"/>        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="8dp"            android:text="@string/info"            android:textSize="12sp"/>        <TextView            android:id="@+id/info_data"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:gravity="center"            android:layout_weight="1"            android:layout_marginLeft="3dp"            android:layout_marginRight="3dp"            android:text=""            android:textColor="@android:color/holo_green_dark"            android:background="@drawable/text_style"            android:textSize="12sp"/>    </LinearLayout></RelativeLayout>
0 0
原创粉丝点击