python中技巧

1.使用xpath从html文档得到其中元素:

<a href="www.abidu.com">123we</a>为了得到其中的123we元素

tree=html.fromstring(***.text)

tt=list(set(tree.xpath("//a[@href=‘www.abidu.com‘]/text()")));

这样就可以提取123we元素,

在BeautifulSoup中:

r=soup.find(‘td‘,title="*****")

tt=r.get_text().split()//同样也可以得到相同的元素

2.soup.select写css时标签名不加修饰,类名前加点,id名加#,

组合查找:类标签语id名之间用空格隔开,同样通过子名查找要空格

soup.select(‘head > tr‘)

soup.select(‘p #link1‘)

还可以通过属性名查找:soup.select(‘a[class="sister"]‘)

3.在Python3中没有URllib2模块,只有urrlib,想运用urlopen,在3中只能是

urllib.request.urlopen(url)  ##只能这样用

4.如果网页用res=request.Session().get(URL)要想要Bs4打开文件,必须要先将其转换成html,

con=html.formstring(res.text),在采用requests.get()//从服务器端得到的数据包,会有各种type类型的操作,print出现中文乱码

得到的con的type类型是 <class ‘lxml.html.HtmlElement‘>,在这个里面的过程中发现若将其print会遇到出现乱码的过程

如果在其中使用py2.7下的urllib.urlopen(root_url).read()得到的是字符串形式,print打印下不需要进行中文乱码的的处理

II.对requests中文乱码的处理

.在使用requests模块中爬取新浪的网页的时候出现中文乱码,查看其中编码方式

print(res.encoding) ##response内容的编码,采用的内部编码方式

print(res.apparent_encoding)##返回HTML文档中content-type头文件中编码,html的网页头文本编码方式,不同于从抓取的网页内部编码

print(requests.utils.get_encodings_from_content(res.text))##response返回的html header标签里设置的编码,从content得到hearders中编码方式,之上一个结果

对于这样的处理,在requests模块中当从

1 res=requests.get(Root_url) 2 print r.text

如果直接调用print 函数,打印r.text,在win7下print函数默认的只能是GBK方式,或者GB18030模式,当特别的Unicode字符对于GBK无法进行编码的,当调用r.text下函数,自动将网页中数据自动解码成Unicode,如果GBK模式不成话,采用集合体GB18030,

如下:

1 Root_url="http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB#place"
2
3 res=requests.get(Root_url)
4 res.encoding=‘gb18030‘
5
6 print res.textres.encoding=‘GBK‘print res.text

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <meta http-equiv="Content-type" content="text/html; charset=gb2312"/>
  5     <title>Sina Visitor System</title>
  6 </head>
  7 <body>
  8 <span id="message"></span>
  9 <script type="text/javascript" src="/js/visitor/mini.js"></script>
 10 <script type="text/javascript">
 11     window.use_fp = "1" == "1"; // 是否采集设备指纹。
 12     var url = url || {};
 13     (function () {
 14         this.l = function (u, c) {
 15             try {
 16                 var s = document.createElement("script");
 17                 s.type = "text/javascript";
 18                 s[document.all ? "onreadystatechange" : "onload"] = function () {
 19
 20                     if (document.all && this.readyState != "loaded" && this.readyState != "complete") {
 21                         return
 22                     }
 23                     this[document.all ? "onreadystatechange" : "onload"] = null;
 24                     this.parentNode.removeChild(this);
 25                     if (c) {
 26                         c()
 27                     }
 28                 };
 29                 s.src = u;
 30                 document.getElementsByTagName("head")[0].appendChild(s)
 31             } catch (e) {
 32             }
 33         };
 34     }).call(url);
 35
 36     // 流程入口。
 37     wload(function () {
 38
 39         try {
 40
 41             var need_restore = "1" == "1"; // 是否走恢复身份流程。
 42
 43             // 如果需要走恢复身份流程,尝试从 cookie 获取用户身份。
 44             if (!need_restore || !Store.CookieHelper.get("SRF")) {
 45
 46                 // 若获取失败走创建访客流程。
 47                 // 流程执行时间过长(超过 3s),则认为出错。
 48                 var error_timeout = window.setTimeout("error_back()", 3000);
 49
 50                 tid.get(function (tid, where, confidence) {
 51                     // 取指纹顺利完成,清除出错 timeout 。
 52                     window.clearTimeout(error_timeout);
 53                     incarnate(tid, where, confidence);
 54                 });
 55             } else {
 56                 // 用户身份存在,尝试恢复用户身份。
 57                 restore();
 58             }
 59         } catch (e) {
 60             // 出错。
 61             error_back();
 62         }
 63     });
 64
 65     // “返回” 回调函数。
 66     var return_back = function (response) {
 67
 68         if (response["retcode"] == 20000000) {
 69             back();
 70         } else {
 71             // 出错。
 72             error_back(response["msg"]);
 73         }
 74     };
 75
 76     // 跳转回初始地址。
 77     var back = function() {
 78
 79         var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
 80         if (url != "none") {
 81             window.location.href = url;
 82         }
 83     };
 84
 85     // 跨域广播。
 86     var cross_domain = function (response) {
 87
 88         var from = "weibo";
 89         if (response["retcode"] == 20000000) {
 90
 91             var crossdomain_host = "login.sina.com.cn";
 92             if (crossdomain_host != "none") {
 93
 94                 var cross_domain_intr = window.location.protocol + "//" + crossdomain_host + "/visitor/visitor?a=crossdomain&cb=return_back&s=" +
 95                         encodeURIComponent(response["data"]["sub"]) + "&sp=" + encodeURIComponent(response["data"]["subp"]) + "&from=" + from + "&_rand=" + Math.random();
 96                 url.l(cross_domain_intr);
 97             } else {
 98
 99                 back();
100             }
101         } else {
102
103             // 出错。
104             error_back(response["msg"]);
105         }
106     };
107
108     // 为用户赋予访客身份 。
109     var incarnate = function (tid, where, conficence) {
110
111         var gen_conf = "";
112         var from = "weibo";
113         var incarnate_intr = window.location.protocol + "//" + window.location.host + "/visitor/visitor?a=incarnate&t=" +
114                 encodeURIComponent(tid) + "&w=" + encodeURIComponent(where) + "&c=" + encodeURIComponent(conficence) +
115                 "&gc=" + encodeURIComponent(gen_conf) + "&cb=cross_domain&from=" + from + "&_rand=" + Math.random();
116         url.l(incarnate_intr);
117     };
118
119     // 恢复用户丢失的身份。
120     var restore = function () {
121
122         var from = "weibo";
123         var restore_intr = window.location.protocol + "//" + window.location.host +
124                 "/visitor/visitor?a=restore&cb=restore_back&from=" + from + "&_rand=" + Math.random();
125
126         url.l(restore_intr);
127     };
128
129     // 跨域恢复丢失的身份。
130     var restore_back = function (response) {
131
132         // 身份恢复成功走广播流程,否则走创建访客流程。
133         if (response["retcode"] == 20000000) {
134
135             var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
136             var alt = response["data"]["alt"];
137             var savestate = response["data"]["savestate"];
138             if (alt != "") {
139                 requrl = (url == "none") ? "" : "&url=" + encodeURIComponent(url);
140                 var params = "entry=sso&alt=" + encodeURIComponent(alt) + "&returntype=META" +
141                         "&gateway=1&savestate=" + encodeURIComponent(savestate) + requrl;
142                 window.location.href = "http://login.sina.com.cn/sso/login.php?" + params;
143             } else {
144
145                 cross_domain(response);
146             }
147         } else {
148
149             tid.get(function (tid, where, confidence) {
150                 incarnate(tid, where, confidence);
151             });
152         }
153     };
154
155     // 出错情况返回登录页。
156     var error_back = function (msg) {
157
158         var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
159         if (url != "none") {
160
161             if (url.indexOf("ssovie4c55=0") === -1) {
162                 url += (((url.indexOf("?") === -1) ? "?" : "&") + "ssovie4c55=0");
163             }
164             window.location.href = "http://weibo.com/login.php";
165         } else {
166
167             if(document.getElementById("message")) {
168                 document.getElementById("message").innerHTML = "Error occurred" + (msg ? (": " + msg) : ".");
169             }
170         }
171     }
172
173 </script>
174 </body>
175 </html>
176 <!DOCTYPE html>
177 <html>
178 <head>
179     <meta http-equiv="Content-type" content="text/html; charset=gb2312"/>
180     <title>Sina Visitor System</title>
181 </head>
182 <body>
183 <span id="message"></span>
184 <script type="text/javascript" src="/js/visitor/mini.js"></script>
185 <script type="text/javascript">
186     window.use_fp = "1" == "1"; // 是否采集设备指纹。
187     var url = url || {};
188     (function () {
189         this.l = function (u, c) {
190             try {
191                 var s = document.createElement("script");
192                 s.type = "text/javascript";
193                 s[document.all ? "onreadystatechange" : "onload"] = function () {
194
195                     if (document.all && this.readyState != "loaded" && this.readyState != "complete") {
196                         return
197                     }
198                     this[document.all ? "onreadystatechange" : "onload"] = null;
199                     this.parentNode.removeChild(this);
200                     if (c) {
201                         c()
202                     }
203                 };
204                 s.src = u;
205                 document.getElementsByTagName("head")[0].appendChild(s)
206             } catch (e) {
207             }
208         };
209     }).call(url);
210
211     // 流程入口。
212     wload(function () {
213
214         try {
215
216             var need_restore = "1" == "1"; // 是否走恢复身份流程。
217
218             // 如果需要走恢复身份流程,尝试从 cookie 获取用户身份。
219             if (!need_restore || !Store.CookieHelper.get("SRF")) {
220
221                 // 若获取失败走创建访客流程。
222                 // 流程执行时间过长(超过 3s),则认为出错。
223                 var error_timeout = window.setTimeout("error_back()", 3000);
224
225                 tid.get(function (tid, where, confidence) {
226                     // 取指纹顺利完成,清除出错 timeout 。
227                     window.clearTimeout(error_timeout);
228                     incarnate(tid, where, confidence);
229                 });
230             } else {
231                 // 用户身份存在,尝试恢复用户身份。
232                 restore();
233             }
234         } catch (e) {
235             // 出错。
236             error_back();
237         }
238     });
239
240     // “返回” 回调函数。
241     var return_back = function (response) {
242
243         if (response["retcode"] == 20000000) {
244             back();
245         } else {
246             // 出错。
247             error_back(response["msg"]);
248         }
249     };
250
251     // 跳转回初始地址。
252     var back = function() {
253
254         var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
255         if (url != "none") {
256             window.location.href = url;
257         }
258     };
259
260     // 跨域广播。
261     var cross_domain = function (response) {
262
263         var from = "weibo";
264         if (response["retcode"] == 20000000) {
265
266             var crossdomain_host = "login.sina.com.cn";
267             if (crossdomain_host != "none") {
268
269                 var cross_domain_intr = window.location.protocol + "//" + crossdomain_host + "/visitor/visitor?a=crossdomain&cb=return_back&s=" +
270                         encodeURIComponent(response["data"]["sub"]) + "&sp=" + encodeURIComponent(response["data"]["subp"]) + "&from=" + from + "&_rand=" + Math.random();
271                 url.l(cross_domain_intr);
272             } else {
273
274                 back();
275             }
276         } else {
277
278             // 出错。
279             error_back(response["msg"]);
280         }
281     };
282
283     // 为用户赋予访客身份 。
284     var incarnate = function (tid, where, conficence) {
285
286         var gen_conf = "";
287         var from = "weibo";
288         var incarnate_intr = window.location.protocol + "//" + window.location.host + "/visitor/visitor?a=incarnate&t=" +
289                 encodeURIComponent(tid) + "&w=" + encodeURIComponent(where) + "&c=" + encodeURIComponent(conficence) +
290                 "&gc=" + encodeURIComponent(gen_conf) + "&cb=cross_domain&from=" + from + "&_rand=" + Math.random();
291         url.l(incarnate_intr);
292     };
293
294     // 恢复用户丢失的身份。
295     var restore = function () {
296
297         var from = "weibo";
298         var restore_intr = window.location.protocol + "//" + window.location.host +
299                 "/visitor/visitor?a=restore&cb=restore_back&from=" + from + "&_rand=" + Math.random();
300
301         url.l(restore_intr);
302     };
303
304     // 跨域恢复丢失的身份。
305     var restore_back = function (response) {
306
307         // 身份恢复成功走广播流程,否则走创建访客流程。
308         if (response["retcode"] == 20000000) {
309
310             var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
311             var alt = response["data"]["alt"];
312             var savestate = response["data"]["savestate"];
313             if (alt != "") {
314                 requrl = (url == "none") ? "" : "&url=" + encodeURIComponent(url);
315                 var params = "entry=sso&alt=" + encodeURIComponent(alt) + "&returntype=META" +
316                         "&gateway=1&savestate=" + encodeURIComponent(savestate) + requrl;
317                 window.location.href = "http://login.sina.com.cn/sso/login.php?" + params;
318             } else {
319
320                 cross_domain(response);
321             }
322         } else {
323
324             tid.get(function (tid, where, confidence) {
325                 incarnate(tid, where, confidence);
326             });
327         }
328     };
329
330     // 出错情况返回登录页。
331     var error_back = function (msg) {
332
333         var url = "http://weibo.com/p/1035051191258123/celebrity?from=page_103505&mod=TAB";
334         if (url != "none") {
335
336             if (url.indexOf("ssovie4c55=0") === -1) {
337                 url += (((url.indexOf("?") === -1) ? "?" : "&") + "ssovie4c55=0");
338             }
339             window.location.href = "http://weibo.com/login.php";
340         } else {
341
342             if(document.getElementById("message")) {
343                 document.getElementById("message").innerHTML = "Error occurred" + (msg ? (": " + msg) : ".");
344             }
345         }
346     }
347
348 </script>
349 </body>
350 </html>

结果中显示的到,得到相同的结果。

5.使用BeautifulSoup(***)//这里***文档type要是lxml格式的,

用urllib.URLopen().read()得到的是str,不能够用BeautifulSoup进行解析

8.RSA 公密加钥算法:大的质数相乘简单,但是将其乘积因式分解很困难,

“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

需要一对密钥,用其中一个密钥加密,解密需要另外一个密钥。这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。

原理:两个质数e1,e2,n表示其用二进制所占的位数,e1任取,p,q为两个大质数,e1与(p-1)*(q-1)互质;再选择e2,(e2*e1)mod(p-1)(q-1)=1,e1,e2不一定等于大质数p,q

如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。

利用rsa模块对字符串进行加密操作:

1  import rsa
2         rsaPublickey = int(pubkey, 16)
3         key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
4         message = str(servertime) + ‘\t‘ + str(nonce) + ‘\n‘ + str(password) #拼接明文js加密文件中得到
5         passwd = rsa.encrypt(message, key) #加密
6         passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
7         return passwd

9.正则表达式:(),[],{}

() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。

(\s*)表示连续空格的字符串。

[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。

{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格。

(0-9) 匹配 ‘0-9′ 本身。 [0-9]* 匹配数字(注意后面有 *,可以为空)[0-9]+ 匹配数字(注意后面有 +,不可以为空){1-9} 写法错误。

[0-9]{0,9} 表示长度为 0 到 9 的数字字符串。

正则表达式用re.findall(pattern,content(‘查询文档‘)) pattern可以采用正则表达式进行提取:

10.__init__方法主要用在python建立类的过程中对类中变量进行初始化的作用:

__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。注意,这个名称的开始和结尾都是双下划

 1 lock=threading.Condition()
 2
 3 class Produce(threading.Thread):
 4
 5     def __init__(self,lock,product,filename):
 6         self._lock=lock
 7         self.product=product
 8         self.file=filename
 9         threading.Thread.__init__(self)
10
11 if __name__==‘__main__‘:
12     product=[]
13     ##假设product有五位:,消费者只有三位
14     for i in xrange(5):
15         p=Produce(lock,product,‘log_in.txt‘)
时间: 2024-10-12 17:36:23

python中技巧的相关文章

python中的小技巧

1.求1~100以内的素数 prime=filter(lambda x: not [x%i for i in range(2,x) if x%i==0], range(2,101))#列表推导,一行搞定.print prime 2.求字符串子串 s='hauifnefldmfp'[s[i:i+n] for i in range(len(s)) for n in range(1, len(s)-i+1)] 3.求任意字符串中,所有符合ab 类型的子串: eg:s ='aabbbb123456jji

Python中的可变、不可变对象和赋值技巧序列解包

可变对象和不可变对象 在python中一切皆对象.在Python中不存在所谓的值传递调用,一切传递都是对象的引用,也可认为是传址. python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple).数值型(number).字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象. 不可变对象 见一个例子,分析不可变对象的特点 python内置id()函数,用于返回对象的唯一标识(identity).id()

Python 中的一些小技巧

这里是本人收集的一些 Python 小技巧,目前主要是一些实用函数,适合有一定基础的童鞋观看(不会专门介绍使用到的标准库函数).. 一.函数式编程 函数式编程用来处理数据,感觉很方便.(要是再配上管道操作符 | 或者 Java 的那种链式调用,超级爽!可惜 Python 都没有..需要借助第三方库) 1. 分组/group 数据处理中一个常见的操作,是将列表中的元素,依次每 k 个分作一组. def group_each(a, size: int):     """     

整理了8个Python中既冷门又实用的技巧

1.print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设置的. 一个小例子 def esc(code=0): return f'\033[{code}m' print(esc('31;1;0') + 'Error:'+esc()+'important') 在控制台或者 Pycharm 运行这段代码之后你会得到结果. Error:important 其中 E

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

详解 Python 中的下划线命名规则

在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. >>> _ Traceback (most recent call last): Fil

python中yield用法

在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发 StopIteration.任何这类的对象在Python中都可以用for循

Python学习笔记整理(四)Python中的字符串..

字符串是一个有序的字符集合,用于存储和表现基于文本的信息. 常见的字符串常量和表达式 T1=‘’ 空字符串 T2="diege's" 双引号 T3="""...""" 三重引号块 T4=r'\temp\diege' Raw字符串 抑制(取消)转义,完全打印\tmp\diege,而没有制表符 T5=u’diege' Unicode字符串 T1+T2     合并 T1*3    重复 T2[i]    索引 T2[i:j] 分片

59个Python使用技巧,从此你的Python与众不同!

今天给大家分享几个Python使用的小技巧,原文来自于Python 技巧总结,进行了细微的调整,感谢作者! 1. 枚举 - enumerate 可以有参数哦 之前我们这样操作: i = 0for item in iterable: print i, item i += 1 现在我们这样操作: for i, item in enumerate(iterable):  print i, item enumerate函数还可以接收第二个参数.就像下面这样: >>> list(enumerate