zoukankan      html  css  js  c++  java
  • 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>
    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) + '	' + str(nonce) + '
    ' + 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')
  • 相关阅读:
    【疑难系列】 是程序卡住了还是怎么了?
    【疑难系列】 一个看起来是数据库死锁的问题
    求求别再这么用log4x了
    如何动态在spring mvc中增加bean
    java中被各种XXUtil/XXUtils辅助类恶心到了,推荐这种命名方法
    少搞点语法糖,多写点功能
    记一次在java中的日期parse错误
    《自控力》读后感·一
    实现数据权限控制的一种方法
    10个必会的 PyCharm 技巧
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/5778020.html
Copyright © 2011-2022 走看看