自动填写表单 之前用C语言实现过一个访问学校图书馆界面,自动填写表单获取图书信息的程序。最近正在学python感觉这方面它很好很强大,来实现一个熟悉下python。
表单这个玩意在网页中太常见了,放在标签<form>中学校图书馆的表单就是这个样子。
- <form method="POST" action="searchout.jsp" name="suchen" onsubmit="javascript:return check(this);">
-
<table width=300 border=0>
-
<BR>
-
<tr>
-
<td align=right >检索词类型: </td>
-
<td>
-
<select name="suchen_type" size="1">
-
<option value="1">所有题名</option>
-
<option value="2">出版社</option>
-
<option value="3">索书号</option>
-
...
-
</select>
-
</td>
-
</tr>
-
<tr>
-
<td align=right >检索词: </td>
-
<td><input id="suchen_word" name="suchen_word" type="text" size="18" autocomplete="off" class=input_text value="" >
-
</td>
-
</tr>
-
<tr>
-
<td align=right >匹配方式: </td>
-
<td>
-
<select name="suchen_match" size="1">
-
<option value="qx">前向匹配</option>
-
<option value="mh">模糊匹配</option>
-
<option value="jq">精确匹配</option>
-
</select>
-
</td>
-
</tr>
-
<tr>
-
<td align=right >资料类型: </td>
-
<td>
-
-
<select name="recordtype">
-
<option value='all'>全部</option>
-
<option value="##">所有类型</option>
-
<option value="01">中文图书</option>
-
<option value="02">西文图书</option>
-
<option value="03">日文图书</option>
-
<option value="04">俄文图书</option>
-
<option value="11">中文期刊</option>
-
...
-
-
</select>
-
</td>
-
</tr>
-
<input type="hidden" name="suchen_way" value="Ya" >
-
-
<tr>
-
<td colspan=2 align=center >
-
<input type="submit" value="确定" name="B1">
-
<input type="reset" value="重写" name="B2"></p>
-
</td>
-
</tr>
-
</table>
-
</form>
代码太多了,省了点。
从这第一行看出提交方式 是post 提交到的页面是searchout.jsp。看到这个表单中有输入框 type=input,几个选择框type=select 单选框type=radio。注意name和value是需要在编码中用到的。现在的任务就是将每个表单项的值传给提交的页面也就是searchout.jsp。
python 代码
- url = ""
- search = urllib.urlencode( [('suchen_type', '1'), ('suchen_word', a.encode('gb18030')),
-
('suchen_match', 'qx'), ('recordtype', 'all'), ('library_id', 'all'),('show_type','wenzi')])
-
req = urllib2.Request(url)
-
fd = urllib2.urlopen(req, search).read()
-
html = fd.decode('gb18030').encode('utf-8')
就是用urllib2中的urlopen方法,将填写表单的值直接传递给searchout.jsp。这种方式需要将参数放在urlopen中的第二个参数中。同样参数传递时需要调用urlencode进行编码。完成后直接调用read方法就可获得全部返回内容 。这里需要注意处理中文的问题。在提交时向输入框中如果输入中文的话如果不经过转码会出现乱码问题。同时read调用 返回后的东西,一般是要经过再次处理所以也需要转码。在python中转码需要注意 python中编码以unicode为基准,一般需要先解码成unicode在进行编码。此时需要知道两个信息,此文本的原编码是什么,和要将其转为什么编码。查询了一下发现网页上的编码为gb18030,所以在参数中加入提交时将内容转成gb18030编码,此时文本编码本为unicode所以不需要解码,直接转就可。在read调用后将其先解码成unicode=>fd.decode('gb18030') 再进行编码.encode('utf-8')
lxml解析html并生成xml
得到网页返回后的数据需要进行加工成xml格式的文本,选来选去最后选择了lxml这个第三方库。
- dom = soupparser.fromstring(html)
用soupparser这种方
式即使网页不是按规范来写也可以解析。然后主要用了这几个方法。
- div = dom.get_element_by_id('searchout_tuwen')
-
for ele in div.itertext():
将其中的文本拿出。再将其生成一个xml格式的文件。
- root = etree.Element("root")
-
etree.SubElement(book, "order").text = ele
-
etree.SubElement(book, "name").text = ele
-
etree.SubElement(book, "author").text = ele
-
...
- etree.tostring(root, encoding='utf-8', pretty_print=True))
这里注意转化编码格式
最化就是这样了
- <root>
-
<book>
-
<order>1</order>
-
<name>
-
Django Web开发指南 = Python web development with django
-
</name>
-
<author>杰佛,鲍尔,陈仲才徐旭铭</author>
-
<isbn>978-7-111-27028-7</isbn>
-
<pub>机械工业出版社</pub>
-
<year>2009</year>
-
</book>
-
<book>
-
<order>2</order>
-
<name>PYTHON IN A NUTSHELL = PYTHON 技术手册 : 第2版</name>
-
<author>马特利</author>
-
<isbn>978-7-5641-0576-1</isbn>
-
<pub>东南大学出版社</pub>
-
<year>2006</year>
-
</book>
-
<book>
-
<order>3</order>
-
<name>Python 3 程序开发指南 = Programming in Python 3</name>
-
<author>萨默菲尔德王弘博,孙传庆</author>
-
<isbn>978-7-115-24507-6</isbn>
-
<pub>人民邮电出版社</pub>
-
<year>2011</year>
-
</book>
-
...
-
</root>
阅读(2105) | 评论(0) | 转发(0) |