html2javabean

  这个有“标题党”之嫌了。名字但是像模像样。关于网页爬虫(就是抓取网页内容)的小工具大家都写过吧。可是一般写这样的东西都是类似完成某个简单的需求而 写的类似脚本语言的东西,一般代码不多,类似黑客程序代码风格。大家应该没有做过大型项目全部以抓取网页内容为数据源吧?我就做过这样的项目,呵呵。
如果真是一个多人合作,周期较长,又是一个产品型的项目,需要维护,升级,那代码就不是一次性的了。得有点企业开发的代码风格。
 如果数据源都是要从网页抓取的话,开发就很装简单了,先通过URLConnection之类的api得到网页内容,再用正则表达式分析出里面有用的内容。 就这么简单。可是如果是一个项目,页面上千个,而且,还有而且哦,而且别人的网页格式可能会变,布局会变,举个例子,假如一段html是<td class="tig">user001</td>,现在改成了<li>user001</li>,有用的数 据"user001"没有变,可是样式变了。这时候如果还要改代码的话是不是要在代码改正则表达式了。
这时我们就需要一个这样的功能组件,可以把某段html代码里有用的信息抽取出来,转成我们可以操作的业务bean对象。
而且这个抽取规则是可配置的,而不是硬编码在代码里。就像这样的配置文件

 1 <html2javaConfig>
2
3 <bean id="user1" class="com.googlecode.html2javabean.client.User">
4
5 <property name="name" groupIndex="1">
6
7 <![CDATA[
8
9 <span id="lblName">(.*?)</span>
10
11 ]]>
12
13 </property>
14
15 <property name="code">
16
17 <![CDATA[
18
19 <span id="lblWork">(.*?)</span></td>
20
21 ]]>
22
23 </property>
24
25 <property name="isMan">
26
27 <![CDATA[
28
29 <span id="lblSex">(.*?)</span></td>
30
31 ]]>
32
33 </property>
34
35 </bean>
36
37 </html2javaConfig>

要抽取的html文件如下

  1 <table style="height: 306px;  99%;">
2
3 <tr>
4
5 <th style=" 100px;" align="left">
6
7 姓名:</th>
8
9 <td>
10
11 &nbsp;<span id="lblName">tony</span>
12
13 </td>
14
15 </tr>
16
17 <tr>
18
19 <th align="left">
20
21 员工编号:</th>
22
23 <td>
24
25 <span id="lblWork">ite00395</span></td>
26
27 </tr>
28
29 <tr>
30
31 <th align="left">
32
33 性别:</th>
34
35 <td>
36
37 <span id="lblSex">man</span></td>
38
39 </tr>
40
41 <tr>
42
43 <th align="left">
44
45 Email:</th>
46
47 <td>
48
49 <span id="lblEmail">lihf@gggg.com</span>
50
51 </td>
52
53 </tr>
54
55 <tr>
56
57 <th align="left">
58
59 MSN:</th>
60
61 <td>
62
63 <span id="lblMsn"> lhf@hotmail.com</span></td>
64
65 </tr>
66
67 <tr>
68
69 <th align="left">
70
71 公司电话:</th>
72
73 <td>
74
75 <span id="lblPhone"></span></td>
76
77 </tr>
78
79 <tr>
80
81 <th align="left">
82
83 移动电话:</th>
84
85 <td>
86
87 <span id="lblMobile">13714896419</span></td>
88
89 </tr>
90
91 <tr>
92
93 <th align="left">
94
95 所属部门:</th>
96
97 <td valign="middle">
98
99 <span id="lblDepartment">P后台项目组</span></td>
100
101 </tr>
102
103 <tr>
104
105 <th align="left">
106
107 部门地址:</th>
108
109 <td valign="middle">
110
111 <span id="lblDeptAddress"></span></td>
112
113 </tr>
114
115 </table>

最终转成的javabean对象如下:

public class User implements Serializable{



/**

* serialVersionUID

*/

private static final long serialVersionUID = 5014957386430143870L;



private String name;

private String code;

private boolean isMan;

private String email;

private String msn;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

public boolean isMan() {

return isMan;

}

public void setMan(boolean isMan) {

this.isMan = isMan;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getMsn() {

return msn;

}

public void setMsn(String msn) {

this.msn = msn;

}

}

这样就可以用以下的代码调用这个组件了:

public void testParse() throws IOException{

String resource
= "h2j_config.xml";

Reader reader
= Resources.getResourceAsReader(resource);

Html2JavabeanClient client
= Html2JavabeanClientBuilder.buildSqlMapClient(reader);

StringWriter sw
= new StringWriter();

InputStream is
= Resources.getResourceAsStream("oneuser.html");

BufferedReader reader1
= new BufferedReader(new InputStreamReader(is));

String temp
= null;

while((temp = reader1.readLine()) != null){

sw.write(temp);

}

reader1.close();

User u
= (User)client.parseForObject("user1", sw.getBuffer().toString());

System.out.println(u.getName()
+ " " + u.getCode());

}

感觉使用起来很像ibatis是吧,因为我这个组件就是拿的ibatis里解析xml的代码改的,学习ibatis源码的时候有了这个想法。
如果有人遇到这种情况的项目不得不解析很多html的话,这种组件想法还是不错的。有需要的可以参考下我写的代码,然后自己写个,我的代码其其实没有写完,只是实验性的做了个demo。如果需要交流的可以email我。
        又想起了广州岑村高科和那帮兄弟一起的日子。

       项目代码地址:

       http://code.google.com/p/html2javabean/

原文地址:https://www.cnblogs.com/jcli/p/2132200.html