首页 > 代码库 > python中技巧

python中技巧

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

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

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

tt=list(set(tree.xpath("//a[@href=http://www.mamicode.com/‘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=gb180305 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=http://www.mamicode.com/"/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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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://www.mamicode.com/"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://www.mamicode.com/"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=http://www.mamicode.com/"/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                         return197                     }198                     this[document.all ? "onreadystatechange" : "onload"] = null;199                     this.parentNode.removeChild(this);200                     if (c) {201                         c()202                     }203                 };204                 s.src =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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://www.mamicode.com/"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://www.mamicode.com/"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>
View Code

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

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中技巧