偶尔在网上看到matlab中怎么访问网页这个话题,在百度里搜了一下,这方面的回答比较少。所以就想研究一下到底是怎么个回事。下面把实现过程记录如下。
在实现怎么访问网页之前,先来解决一个问题。就是怎么使得网页中的中文不以乱码的形式出现在显示器上?老外的东西,就是麻烦,总是要解决类似的以为语言的不同所带来的问题。我使用的是MATLABR2008a版本的,其实都大同小异,具体情况具体分析。
因此,我们需要修改matlab中的urlread()函数,因为在matlab中是使用urlread()函数来解析网站的内容的。我们需要在urlread()函数中增加一个参数来解决访问中文网站显示乱码的问题。
然后使用regexp()正则函数对访问的网站信息进行匹配提取。
下面给出具体的修改步骤:
1、在matlab中输入命令行edit urlread 打开urlread.m文件。我们需要对该文件进行修改。
2、了解该文件的参数情况:
function [output,status] = urlread(urlChar,method,params);表明该文件有三个参数。那么我们要实现中文解析功能就要增加一个参数webencoding修改如下:
function [output,status] = urlread(urlChar,method,params,webencoding);然后在function后面添加一个语法兼容语句如下
function [output,status] = urlread(urlChar,method,params,webencoding);%%%%%%%%%%%%新添加了参数webencoding %%%%%%%%%%%%%%%%%下面的if语句为新添加的语句 if nargin<4; webencoding='UTF-8'; end3、因为我们刚才增减了一个参数,所以要修改参数数量检验语句,大概在41行左右
把error(nargchk(1,3,nargin))改成error(nargchk(1,4,nargin))即可。
4、修改文件尾部的数据转换语句
原语句:
output = native2unicode(typecast(byteArrayOutputStream.toByteArray','uint8'),'UTF-8');
修改后:
output = native2unicode(typecast(byteArrayOutputStream.toByteArray','uint8'),webencoding);
即把'UTF-8'改为webencoding
5、语法调用函数解析
U=urlread('http://wenku.baidu.com/edu/index','get','','GBK');
第一个是网页地址参数,第二个是get或是post;第三个则是要向网页传递的参数,详细见help文档;第四个为我们增加的解析参数。
原文件修改完成并保存后,接下来就是写调用函数了。具体实现如下:
%下面以提取百度文库文档列表名称为例 clc clear all U=urlread('http://wenku.baidu.com/edu/index','get','','GBK'); %此函数修改过,解决访问网页中文乱码问题 %修改方法参照http://s020700640.blog.hexun.com/81301584_d.html expr1 = '/view/'; %获取下载链接 num= regexp(U, expr1,'end');%正则函数 num(26)=num(25)+500; for i=1:length(num)-1 b=U(num(i):num(i+1)); expr2 = 'title="'; %获取下载链接 num1= regexp(b, expr2,'end');%正则函数 expr3 = '>'; %获取下载链接 num2= regexp(b, expr3,'end');%正则函数 b(num1(1)+1:num2(1)-1) end
#ifndef _TYPEDEFINE_H_ #define _TYPEDEFINE_H_ // 定义芯片类型 #define STM8S903 //#define STM8S103 //=============== I/O位定义 ============ //== INPUT === //---- PA ----- #define PA_IN PA_IDR _Bool PA1_IN @PA_IDR:1; _Bool PA2_IN @PA_IDR:2; _Bool PA3_IN @PA_IDR:3; //---- PB ----- #define PB_IN PB_IDR _Bool PB0_IN @PB_IDR:0; _Bool PB1_IN @PB_IDR:1; _Bool PB2_IN @PB_IDR:2; _Bool PB3_IN @PB_IDR:3; _Bool PB4_IN @PB_IDR:4; _Bool PB5_IN @PB_IDR:5; _Bool PB6_IN @PB_IDR:6; _Bool PB7_IN @PB_IDR:7; //---- PC ----- #define PC_IN PC_IDR _Bool PC0_IN @PC_IDR:0; _Bool PC1_IN @PC_IDR:1; _Bool PC2_IN @PC_IDR:2; _Bool PC3_IN @PC_IDR:3; _Bool PC4_IN @PC_IDR:4; _Bool PC5_IN @PC_IDR:5; _Bool PC6_IN @PC_IDR:6; _Bool PC7_IN @PC_IDR:7; //---- PD ----- #define PD_IN PD_IDR _Bool PD0_IN @PD_IDR:0; _Bool PD1_IN @PD_IDR:1; _Bool PD2_IN @PD_IDR:2; _Bool PD3_IN @PD_IDR:3; _Bool PD4_IN @PD_IDR:4; _Bool PD5_IN @PD_IDR:5; _Bool PD6_IN @PD_IDR:6; _Bool PD7_IN @PD_IDR:7; //---- PE ----- #define PE_IN PE_IDR _Bool PE5_IN @PE_IDR:5; //---- PF ----- #define PF_IN PF_IDR _Bool PF4_IN @PF_IDR:4; //== OUTPUT === //---- PA ----- #define PA_OUT PA_ODR _Bool PA1_OUT @PA_ODR:1; _Bool PA2_OUT @PA_ODR:2; _Bool PA3_OUT @PA_ODR:3; //---- PB ----- #define PB_OUT PB_ODR _Bool PB0_OUT @PB_ODR:0; _Bool PB1_OUT @PB_ODR:1; _Bool PB2_OUT @PB_ODR:2; _Bool PB3_OUT @PB_ODR:3; _Bool PB4_OUT @PB_ODR:4; _Bool PB5_OUT @PB_ODR:5; _Bool PB6_OUT @PB_ODR:6; _Bool PB7_OUT @PB_ODR:7; //---- PC ----- #define PC_OUT PC_ODR _Bool PC1_OUT @PC_ODR:1; _Bool PC2_OUT @PC_ODR:2; _Bool PC3_OUT @PC_ODR:3; _Bool PC4_OUT @PC_ODR:4; _Bool PC5_OUT @PC_ODR:5; _Bool PC6_OUT @PC_ODR:6; _Bool PC7_OUT @PC_ODR:7; //---- PD ----- #define PD_OUT PD_ODR _Bool PD0_OUT @PD_ODR:0; _Bool PD1_OUT @PD_ODR:1; _Bool PD2_OUT @PD_ODR:2; _Bool PD3_OUT @PD_ODR:3; _Bool PD4_OUT @PD_ODR:4; _Bool PD5_OUT @PD_ODR:5; _Bool PD6_OUT @PD_ODR:6; _Bool PD7_OUT @PD_ODR:7; //---- PE ----- #define PE_OUT PE_ODR _Bool PE5_OUT @PE_ODR:5; //---- PF ----- #define PF_OUT PF_ODR _Bool PF4_OUT @PF_ODR:4; //===== I/O 方向寄存器定义 //---- PA --------- #define PA_M PA_DDR _Bool PA1_M @PA_DDR:1; _Bool PA2_M @PA_DDR:2; _Bool PA3_M @PA_DDR:3; //---- PB --------- #define PB_M PB_DDR _Bool PB0_M @PB_DDR:0; _Bool PB1_M @PB_DDR:1; _Bool PB2_M @PB_DDR:2; _Bool PB3_M @PB_DDR:3; _Bool PB4_M @PB_DDR:4; _Bool PB5_M @PB_DDR:5; _Bool PB6_M @PB_DDR:6; _Bool PB7_M @PB_DDR:7; //---- PC --------- #define PC_M PC_DDR _Bool PC1_M @PC_DDR:1; _Bool PC2_M @PC_DDR:2; _Bool PC3_M @PC_DDR:3; _Bool PC4_M @PC_DDR:4; _Bool PC5_M @PC_DDR:5; _Bool PC6_M @PC_DDR:6; _Bool PC7_M @PC_DDR:7; //---- PD --------- #define PD_M PD_DDR _Bool PD0_M @PD_DDR:0; _Bool PD1_M @PD_DDR:1; _Bool PD2_M @PD_DDR:2; _Bool PD3_M @PD_DDR:3; _Bool PD4_M @PD_DDR:4; _Bool PD5_M @PD_DDR:5; _Bool PD6_M @PD_DDR:6; _Bool PD7_M @PD_DDR:7; //---- PE --------- #define PE_M PE_DDR _Bool PE5_M @PE_DDR:5; //---- PF --------- #define PF_M PF_DDR _Bool PF4_M @PF_DDR:4; #endif
实现可扩展展开列ExpandableListView的三种方式 一是使用SimpleExpandableListAdpater将两个List集合包装成ExpandableListView
二是 扩展BaseExpandableListAdpter
三是使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter
public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int groupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout,String[]childFrom, int[] childTo)
第一个参数 应用程序接口 this
第二个父列List<?extends Map<String,Object>>集合 为父列提供数据
第三个参数 父列显示的组件资源文件
第四个参数 键值列表 父列Map字典的key
第五个要显示的父列组件id
第六个 子列的显示资源文件
第七个参数 键值列表的子列Map字典的key
第八个要显示子列的组件id
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/image1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/txt1" android:paddingLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/items" android:layout_width="wrap_content" android:layout_height="wrap_content" > </TextView>
package com.android.xiong.expandablelistviewtest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.ExpandableListView; import android.widget.SimpleExpandableListAdapter; public class MainActivity extends Activity { /** * 实现可扩展展开列ExpandableListView的三种方式 * 一是使用SimpleExpandableListAdpater将两个List集合包装成ExpandableListView * 二是 扩展BaseExpandableListAdpter * 三是使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter */ private int[] images = { R.drawable.one, R.drawable.two, R.drawable.threee }; private String[] names = { "腾讯", "百度", "阿里巴巴" }; private String[][] childnames = { { "QQ", "微信", "手机卫士" }, { "百度地图", "百度视频", "PPS&奇艺" }, { "支付宝", "新郎微博", "高德地图" } }; private ExpandableListView ep; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //定义父列表项List数据集合 List<Map<String, String>> group = new ArrayList<Map<String, String>>(); //定义子列表项List数据集合 List<List<Map<String, String>>> ss = new ArrayList<List<Map<String, String>>>(); for (int i = 0; i < names.length; i++) { //提供父列表的数据 Map<String, String> maps = new HashMap<String, String>(); // maps.put("images", images[i]); maps.put("names", names[i]); group.add(maps); //提供当前父列的子列数据 List<Map<String, String>> child = new ArrayList<Map<String, String>>(); for (int j = 0; j < names.length; j++) { Map<String, String> mapsj = new HashMap<String, String>(); mapsj.put("tengxun", childnames[i][j]); child.add(mapsj); } ss.add(child); } /** * 第一个参数 应用程序接口 this * 第二个父列List<?extends Map<String,Object>>集合 为父列提供数据 * 第三个参数 父列显示的组件资源文件 * 第四个参数 键值列表 父列Map字典的key * 第五个要显示的父列组件id * 第六个 子列的显示资源文件 * 第七个参数 键值列表的子列Map字典的key * 第八个要显示子列的组件id */ SimpleExpandableListAdapter expand = new SimpleExpandableListAdapter( this, group, R.layout.images, new String[] { "names" }, new int[] { R.id.txt1 }, ss, R.layout.txtitem, new String[] { "tengxun" }, new int[] { R.id.items }); ep = (ExpandableListView) findViewById(R.id.ep1); ep.setAdapter(expand); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
下面附上网上其余几种构造函数的解释
public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int groupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout,String[]childFrom, int[] childTo)
构造函数
参数
context 与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData 一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在"groupFrom"中指定的记录。
groupLayout 显示组元素的资源文件。该资源文件定义了如何显示组元素。该布局文件必须至少包括groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom 一个键值列表。对应与组相关联的Map中的键值。
grouptTo 组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData 一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout 显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
childFrom 定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo 子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。
public SimpleExpandableListAdapter (Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[]
childFrom, int[] childTo)
构造函数。
参数
context 与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData 一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在"groupFrom"中指定的记录。
expandedGroupLayout 定义组展开时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
collapasedGroupLayout 定义组折叠时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom 一个键值列表。对应与组相关联的Map中的键值。
grouptTo 组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData 一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout 显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
childFrom 定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo 子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。
public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout, int lastChildLayout,String[]childFrom,
int[] childTo)
构造函数。
参数
context 与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData 一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在"groupFrom"中指定的记录。
expandedGroupLayout 定义组展开时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
collapasedGroupLayout 定义组折叠时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom 一个键值列表。对应与组相关联的Map中的键值。
grouptTo 组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData 一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout 显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
lastChildLayout 定义每组中最后一个子元素的View资源布局情况。该布局文件应当至少包括所有在childTo中所定义的View。(即childTo中的View id数组必须都在该布局文件中找到)
childFrom 定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo 子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。