python中技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.text
res.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‘)
以上是关于python中技巧的主要内容,如果未能解决你的问题,请参考以下文章