Size: 6189
Comment:
|
Size: 12954
Comment: 提取网页中的超链接
|
Deletions are marked like this. | Additions are marked like this. |
Line 10: | Line 10: |
=== 提取网页中的超链接 === {{{#!python r='<a(?:(?:\\s*.*?\\s)|(?:\\s+))href=(?P<url>\S*?)(?:(?:\\s.*>)|(?:>)).*?</a>' compile(r).findall(a) }}} * 这个是我和天成讨论出来的方法,用来提取网页中的超链接,你的正则表达式可能有问题. 还有待改进 * hoxide === 登录脚本 === {{{ 刚刚看了xyb的代码,有点启发。 写了一小段试了以下,可以登录了。呵呵。 import httplib import urllib user=? pwd=? params=urllib.urlencode({"Loginname":user,"Loginpass":pwd,"firstlogin":1,"option":"登入论坛"}) headers={"Accept":"text/html","User-Agent":"IE","Content-Type":"application/x-www-form-urlencoded"} website="www.linuxforum.net" path="/forum/start_page.php" conn=httplib.HTTPConnection(website) conn.request("POST",path,params,headers) r=conn.getresponse() print r.status,r.reason data=r.read() print data conn.close() 不知从form submit数据和直接提交request有些什么区别? }}} * [http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=493559 中国Linux论坛] === 浮点数的输出格式 === {{{ >>> a=6200-6199.997841 >>> a 0.0021589999996649567 >>> print "%f"%a 0.002159 >>> import fpformat >>> fpformat.fix(a, 6) '0.002159' >>> print fpformat.fix(a, 6) 0.002159 >>> print "%.6f"%a 0.002159 >>> print "%.7f"%a 0.0021590 >>> print "%.10f"%a 0.0021590000 >>> print "%.5f"%a 0.00216 }}} |
|
Line 101: | Line 152: |
=== traceback 的处理 === from::[http://www.donews.net/limodou/archive/2004/07/09/40045.aspx Limodou的学习记录] trackback在 Python 中非常有用,它可以显示出现异常(Exception)时代码执行栈的情况。 但当我们捕捉异常,一般是自已的出错处理,因此代码执行栈的信息就看不到了,如果还想显 示的话,就要用到traceback模块了。 这里只是简单的对traceback模块的介绍,不是一个完整的说明,而且只是满足我个人的要求, 更详细的还是要看文档。 打印完整的traceback 让我们先看一个traceback的显示: {{{ >>> 1/0 Traceback (most recent call last): File "", line 1, in -toplevel- 1/0 ZeroDivisionError: integer division or modulo by zero }}} 可以看出 Python 缺省显示的traceback有一个头:第一行,出错详细位置:第二、三行, 异常信息:第四行。也就是说分为三部分,而在traceback可以分别对这三部分进行处理。 不过我更关心完整的显示。 在traceback中提供了print_exc([limit[, file]])函数可以打印出与上面一样的效果。 limit参数是限定代码执行栈的条数,file参数可以将traceback信息输出到文件对象中。缺省的话是输出到错误输出中。举例: {{{ >>> try: 1/0 except: traceback.print_exc() Traceback (most recent call last): File "", line 2, in ? ZeroDivisionError: integer division or modulo by zero }}} 当出现异常sys.exc_info()函数会返回与异常相关的信息。如: {{{ >>> try: 1/0 except: sys.exc_info() (<class exceptions.ZeroDivisionError at 0x00BF4CC0>, <exceptions.ZeroDivisionError instance at 0x00E29DC8>, <traceback object at 0x00E29DF0>) }}} sys.exc_info()返回一个tuple,异常类,异常实例,和traceback。 print_exc()是直接输出了,如果我们想得到它的内容,如何做?使用 format_exception(type, value, tb [,limit]),type, value, tb分别对应 sys.exc_info()对应的三个值。如: {{{ >>> try: 1/0 except: type, value, tb = sys.exc_info() print traceback.format_exception(type, value, tb) ['Traceback (most recent call last):\n', ' File "", line 2, in ?\n', 'ZeroDivisionError: integer division or modulo by zero\n'] }}} 这样,我们知道了format_exception返回一个字符串列表,这样我们就可以将其应用到我们的程序中了。 |
|
Line 153: | Line 278: |
== Python哲学--内省的威力 == * [http://python.cn/pipermail/python-chinese/2004-August/004091.html Xie Yanbo] 引发 * http://www.python.org/pics/batteries-included.jpg * '''Remember, Python comes with batteries included!''' * Python 可以使用内省的功能,获得丰富的信息。例如,如果我们想知道 dict 具有什么方法,那么我们可以像下面这样: {{{ >>> dir({}) ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>> }}} 好,现在我们得到了一个列表,那么这些都是干什么用的呢? 我们需要更多的信息: {{{ >>> type({}.update) <type 'builtin_function_or_method'> }}} 上面,我们使用 type() 得知 dict 的 update 方法是一个 'builtin_function_or_method' ,这说明这是一个Python原生代码(在Python源代码中用C写成)。update究竟怎么用呢? 原来 python 已经给我们嵌入了文档: {{{ >>> {}.update.__doc__ 'D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]' }}} 此处的 __doc__ 是一个函数中的一个文档字符串,另外还有 module,class 的 __doc__。 在自己写程序时,可以使用类似下面的方法增加__doc__: {{{ >>> def add(a,b): """ My demo add method.""" return a + b >>> add.__doc__ ' My demo add method.' }}} 自动获得模块信息的探讨:(初步探索) 例子程序: {{{ # AMod.py # module AMod """ A demo module for auto get __doc__ This is a module __doc__ """ def Afun(): """ Afun 's __doc__ """ class AClass: """ AClass __doc__ """ def __init__(self): pass def classFun(): """ Class method's __doc__ """ pass }}} 获得模块信息: {{{ # GetInfo.py import AMod import inspect info = """ Module info: """ info = info + "Module Name:" + AMod.__name__ + '\n' \ + "Module file:" + AMod.__file__ + '\n' \ + "Module doc:" + AMod.__doc__ + '\n\n' mod_dict = AMod.__dict__ for obj in mod_dict.keys(): info = info + "%s \n\t%s\n"%(obj, type(mod_dict[obj])) if inspect.isroutine(mod_dict[obj]): info = info + "\tfunction doc: %s\n"%(mod_dict[obj].__doc__) if inspect.isclass(mod_dict[obj]): info = info + "\tClass doc: %s\n"%(mod_dict[obj].__doc__) print info }}} |
收集Python 各种方面的技巧片段! -- Zoom.Quiet [DateTime(2004-08-09T23:28:59Z)]
各种实用代码片段
提取网页中的超链接
- 这个是我和天成讨论出来的方法,用来提取网页中的超链接,你的正则表达式可能有问题. 还有待改进
- hoxide
登录脚本
刚刚看了xyb的代码,有点启发。 写了一小段试了以下,可以登录了。呵呵。 import httplib import urllib user=? pwd=? params=urllib.urlencode({"Loginname":user,"Loginpass":pwd,"firstlogin":1,"option":"登入论坛"}) headers={"Accept":"text/html","User-Agent":"IE","Content-Type":"application/x-www-form-urlencoded"} website="www.linuxforum.net" path="/forum/start_page.php" conn=httplib.HTTPConnection(website) conn.request("POST",path,params,headers) r=conn.getresponse() print r.status,r.reason data=r.read() print data conn.close() 不知从form submit数据和直接提交request有些什么区别?
浮点数的输出格式
>>> a=6200-6199.997841 >>> a 0.0021589999996649567 >>> print "%f"%a 0.002159 >>> import fpformat >>> fpformat.fix(a, 6) '0.002159' >>> print fpformat.fix(a, 6) 0.002159 >>> print "%.6f"%a 0.002159 >>> print "%.7f"%a 0.0021590 >>> print "%.10f"%a 0.0021590000 >>> print "%.5f"%a 0.00216
怎么下载网络上的一张图片到本地
>知道了一张图片的URL >比如http://www.yahoo.com/images/logo.gif >想将它下载到本地保存应该怎么实现?
1 urllib.urlretrieve(url, filename)
---Limodou
使用locale判断本地语言及编码
from::[http://limodou.donews.net/limodou/posts/11510.aspx limodou的学习记录 ]
在支持unicode软件中,经常需要在不同的编码与unicode之间进行转换。
那么对于一个本地文件的处理,首先要将其内容读出来转换成unicode编码,在软件中处理完毕后,再保存为原来的编码。
如果我们不知道文件的确切编码方式,可以使用默认的编码方式。那么我们可以使用locale模块来判断默认编码方式。
>>>import locale >>>print locale.getdefaultlocale() ('zh_CN', 'cp936')
可以看出,我的机器上默认语言是简体中文,编码是GBK。
__new__的使用
from: [http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=487139&page=1&view=collapsed&sb=5&o=31&fpart= 中国Linux论坛 -rings]
new
new是python里object的方法。如果你要重载new,那么你需要继承object。 new是类方法。他不带self参数。 new和init是不一样的。init带 self参数。所以他是在对象已经被构造好了以后被调用的。而如果你要在对象构造的时候 做一些事情,那么就需要使用new。new的返回值必须是对象的实例。 new一般在 一些模式里非常有用。我们看一个例子。 这个例子是《thinking in python》里的一个Singleton例子
class OnlyOne(object): class __OnlyOne: def __init__(self): self.val = None def __str__(self): return ′self′ + self.val instance = None def __new__(cls): # __new__ always a classmethod if not OnlyOne.instance: OnlyOne.instance = OnlyOne.__OnlyOne() return OnlyOne.instance def __getattr__(self, name): return getattr(self.instance, name) def __setattr__(self, name): return setattr(self.instance, name) x = OnlyOne() x.val = 'sausage' print x y = OnlyOne() y.val = 'eggs' print y z = OnlyOne() z.val = 'spam' print z print x print y
我们可以看到OnlyOne从object继承而来。
如果你不继承object,那么你的 new就不会在构造的时候来调用。
当x = OnlyOne()的时候,其实就是调用new(OnlyOne), 每次实例化OnlyOne 的时候都会调用。
因为他是类方法。
所以这段代码就是利用这个特性来实现Singleton的。
因为不管构造多少对象,都要调用new.
那么在OnlyOne里保持一个类的属性, instance.
他代表嵌套的_OnlyOne的实例。
所以,对于他,我们只构造一次。
- 以后每次构造的时候都是 直接返回这个实例的。
所以,在这里, x,y,z 都是同一个实例。
这个方法和典型的用C++ 来实现 Singleton的道理是一样的。
traceback 的处理
from::[http://www.donews.net/limodou/archive/2004/07/09/40045.aspx Limodou的学习记录]
trackback在 Python 中非常有用,它可以显示出现异常(Exception)时代码执行栈的情况。 但当我们捕捉异常,一般是自已的出错处理,因此代码执行栈的信息就看不到了,如果还想显 示的话,就要用到traceback模块了。
这里只是简单的对traceback模块的介绍,不是一个完整的说明,而且只是满足我个人的要求, 更详细的还是要看文档。
打印完整的traceback
让我们先看一个traceback的显示:
>>> 1/0 Traceback (most recent call last): File "", line 1, in -toplevel- 1/0 ZeroDivisionError: integer division or modulo by zero
可以看出 Python 缺省显示的traceback有一个头:第一行,出错详细位置:第二、三行, 异常信息:第四行。也就是说分为三部分,而在traceback可以分别对这三部分进行处理。 不过我更关心完整的显示。
在traceback中提供了print_exc([limit[, file]])函数可以打印出与上面一样的效果。 limit参数是限定代码执行栈的条数,file参数可以将traceback信息输出到文件对象中。缺省的话是输出到错误输出中。举例:
>>> try: 1/0 except: traceback.print_exc() Traceback (most recent call last): File "", line 2, in ? ZeroDivisionError: integer division or modulo by zero
当出现异常sys.exc_info()函数会返回与异常相关的信息。如:
>>> try: 1/0 except: sys.exc_info() (<class exceptions.ZeroDivisionError at 0x00BF4CC0>, <exceptions.ZeroDivisionError instance at 0x00E29DC8>, <traceback object at 0x00E29DF0>)
sys.exc_info()返回一个tuple,异常类,异常实例,和traceback。
print_exc()是直接输出了,如果我们想得到它的内容,如何做?使用 format_exception(type, value, tb [,limit]),type, value, tb分别对应 sys.exc_info()对应的三个值。如:
>>> try: 1/0 except: type, value, tb = sys.exc_info() print traceback.format_exception(type, value, tb) ['Traceback (most recent call last):\n', ' File "", line 2, in ?\n', 'ZeroDivisionError: integer division or modulo by zero\n']
这样,我们知道了format_exception返回一个字符串列表,这样我们就可以将其应用到我们的程序中了。
Python多进程处理之参考大全
from:: [http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀) 多进程处理让很多开发人员转向了线程处理的操作,但是,在一些特别的情况下,我们必须考虑两个完全不同的系统间的进程通讯。方法很多,最简单的办法就是通过IPC进行操作了。 这几天我一直在寻找这方面的资源,有所收获后,记载下来,收录归档罢。
RemontD是一个python的进程间解决方案,它可以让你的多个进程共享一个dictionary来进行交互操作。
则是一个类RMI的多台服务器远程过程调用的解决方案,但是它支持在本机调用时使用IPC进行操作。
POSH的作者显然是一个线程的憎恨者,他为PyCon DC 2003贡献了POSH,它使得python的进程间可以共享数据。
显然是两个python的IPC简单包装,你可能在不同的平台上要自己仔细试试了。在表面上,两者都说明自己支持Linux平台的。
伟大的ONLAMP总是会给我惊喜,这是使用PHP来操作共享内存的一个非常好的文章,它甚至将IPC在unix下的使用也说的非常的明白了。
这是一个在两年前就看到的一个python操作共享内存的实现,如果必须从头做起,相信这个原始的代码,可以成为一个很好的参考。
将你的Python脚本转换为Windows exe程序
from:: [http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀)
将Python的脚本变为一个可以执行的Windows exe程序可能的好处会说出很多,我最喜欢的则是它会让你写的程序更像是一个“程序”罢。但是,凡事有利就有弊,这样必然会让python的一些好处没有了。
你可以从这里找到[http://starship.python.net/crew/theller/py2exe/ py2exe]的相关信息,可以在这里下载到[http://prdownloads.sourceforge.net/py2exe/py2exe-0.4.2.win32-py2.3.exe?download py2exe-0.4.2.win32-py2.3.exe]安装包。 但是它的使用也还是比较麻烦的,需要你自己手工的写一个小的脚本,就像这样:
再通过python的执行:
python setup.py py2exe
来使用。更多的信息上它的网站看罢。
Python哲学--内省的威力
[http://python.cn/pipermail/python-chinese/2004-August/004091.html Xie Yanbo] 引发
Remember, Python comes with batteries included!
- Python 可以使用内省的功能,获得丰富的信息。例如,如果我们想知道 dict 具有什么方法,那么我们可以像下面这样:
>>> dir({}) ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] >>>
好,现在我们得到了一个列表,那么这些都是干什么用的呢? 我们需要更多的信息:
>>> type({}.update) <type 'builtin_function_or_method'>
上面,我们使用 type() 得知 dict 的 update 方法是一个 'builtin_function_or_method' ,这说明这是一个Python原生代码(在Python源代码中用C写成)。update究竟怎么用呢? 原来 python 已经给我们嵌入了文档:
>>> {}.update.__doc__ 'D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k]'
此处的 doc 是一个函数中的一个文档字符串,另外还有 module,class 的 doc。 在自己写程序时,可以使用类似下面的方法增加doc:
>>> def add(a,b): """ My demo add method.""" return a + b >>> add.__doc__ ' My demo add method.'
自动获得模块信息的探讨:(初步探索) 例子程序:
# AMod.py # module AMod """ A demo module for auto get __doc__ This is a module __doc__ """ def Afun(): """ Afun 's __doc__ """ class AClass: """ AClass __doc__ """ def __init__(self): pass def classFun(): """ Class method's __doc__ """ pass
获得模块信息:
# GetInfo.py import AMod import inspect info = """ Module info: """ info = info + "Module Name:" + AMod.__name__ + '\n' \ + "Module file:" + AMod.__file__ + '\n' \ + "Module doc:" + AMod.__doc__ + '\n\n' mod_dict = AMod.__dict__ for obj in mod_dict.keys(): info = info + "%s \n\t%s\n"%(obj, type(mod_dict[obj])) if inspect.isroutine(mod_dict[obj]): info = info + "\tfunction doc: %s\n"%(mod_dict[obj].__doc__) if inspect.isclass(mod_dict[obj]): info = info + "\tClass doc: %s\n"%(mod_dict[obj].__doc__) print info