zoukankan      html  css  js  c++  java
  • Python爬虫基础之正则表达式

    一、Python正则表达式的基本使用

     Python 3 使用re模块可以实现大部分的正则表达式情况。

    1.re.compile(pattern, flags=0)

     re.compile构建匹配规则并返回一个正则表达式对象,这样的好处就是可以多次使用这个匹配规则,通过调用它的match()和search()方法或作为re.match和re.search的pattern参数来匹配字符串。

     1 html_doc = "www.cnblogs.com"
     2 pattern = re.compile('www')  # 实例化pattern 对象
     3 match = re.match(pattern,html_doc)  # 或者 match = pattern.match(html_doc)
     4 
     5 if match:  # www不在字符串开始位置,匹配成功
     6     print(match.group(0))
     7 else:
     8     print("not match com")
     9 
    10 # 打印
    11 # www

    2.re.match(pattern, string, flags=0)

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

    匹配成功re.match方法返回一个匹配的对象,否则返回None。

    我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

     1 html_doc = "www.cnblogs.com"
     2 if re.match("www", html_doc):  # www在字符串开始位置,匹配成功
     3     print(re.match("www", html_doc).group(0)) 
     4 else:
     5     print("not match www")
     6 
     7 if re.match("com", html_doc):  # com不在字符串开始位置,匹配失败
     8     print(re.match("com", html_doc).group(0))
     9 else:
    10     print("not match com")
    11 
    12 # 打印
    13 # www
    14 # not match com

    3.re.search(pattern, string, flags=0)

     re.search 扫描整个字符串并返回第一个成功的匹配。

    匹配成功re.search方法返回一个匹配的对象,否则返回None。

    我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

     1 html_doc = "www.cnblogs.com"
     2 if re.search("www", html_doc):  # www在字符串开始位置,匹配成功
     3     print(re.search("www", html_doc).group(0)) 
     4 else:
     5     print("not match www")
     6 
     7 if re.search("com", html_doc):  # com不在字符串开始位置,匹配成功
     8     print(re.search("com", html_doc).group(0))
     9 else:
    10     print("not match com")
    11 
    12 # 打印
    13 # www
    14 # com

    4.re.sub(pattern, repl, string, count=0)

     re.sub用于替换字符串中的匹配项。

    repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

    1 html_doc = "http://www.cnblogs.com"
    2 pattern = re.compile('http')  # 实例化pattern 对象
    3 html_doc_after_sub = re.sub(pattern, "https", html_doc)
    4 print(html_doc_after_sub)
    5 
    6 # 打印
    7 # https://www.cnblogs.com

    5.re.findall(pattern, string, flags=0)

    re.findall查找所有满足pattern匹配规则的字符串,而不像re.match和re.search找到一个满足匹配规则的字符串就直接返回。

    1 html_doc = "He was carefully disguised but captured quickly by police."
    2 pattern = re.compile(r'w+ly')  # 查找所有以ly结尾的单词
    3 results = re.findall(pattern, html_doc)
    4 print(results)
    5 
    6 # 打印
    7 # ['carefully', 'quickly']

    二、Python正则表达式的实际应用

     1 <ul class="m-cvrlst f-cb" id="m-pl-container"> 
     2    <li> 
     3     <div class="u-cover u-cover-1"> 
     4      <img class="j-flag" src="http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140" /> 
     5      <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="msk"></a> 
     6      <div class="bottom"> 
     7       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="832790627" data-res-action="play"></a> 
     8       <span class="icon-headset"></span> 
     9       <span class="nb">1615</span> 
    10      </div> 
    11     </div> <p class="dec"> <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="tit f-thide s-fc0">【说唱】留住你一面,画在我心间</a> </p> <p><span class="s-fc4">by</span> <a title="JediMindTricks" href="/user/home?id=17647877" class="nm nm-icn f-thide s-fc3">JediMindTricks</a> <sup class="u-icn u-icn-84 "></sup> </p> </li> 
    12    <li> 
    13     <div class="u-cover u-cover-1"> 
    14      <img class="j-flag" src="http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140" /> 
    15      <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="msk"></a> 
    16      <div class="bottom"> 
    17       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="721462105" data-res-action="play"></a> 
    18       <span class="icon-headset"></span> 
    19       <span class="nb">77652</span> 
    20      </div> 
    21     </div> <p class="dec"> <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="tit f-thide s-fc0">鞋子好看|国产自赏摇滚噪音流行</a> </p> <p><span class="s-fc4">by</span> <a title="原创君" href="/user/home?id=201586" class="nm nm-icn f-thide s-fc3">原创君</a> <sup class="u-icn u-icn-1 "></sup> </p> </li> 
    22   </ul>

    开始解析html源码

    首先实例化一个正则表达式pattern对象,匹配规则r'<img class="j-flag" src="(.*?)" />',通过re.findall匹配到所有的img标签的src属性,保存在列表results_img_url中.再通过re.findall匹配到所有满足匹配规则r'<a title="(.*?)" href="(.*?)" class="msk"></a>'的按标签,

    并提取属性title和href,保存在元祖中。

     1 import re
     2 
     3 pattern_img = re.compile(r'<img class="j-flag" src="(.*?)" />')
     4 results_img_url = re.findall(pattern_img,html_doc)
     5 print(results_img_url)
     6 # 打印 ['http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140', 'http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140']
     7 pattern_a = re.compile(r'<a title="(.*?)" href="(.*?)" class="msk"></a>')
     8 results_a = re.findall(pattern_a, html_doc)
     9 print(results_a)
    10 # 打印 [('【说唱】留住你一面,画在我心间', '/playlist?id=832790627'), ('鞋子好看|国产自赏摇滚噪音流行', '/playlist?id=721462105')]
  • 相关阅读:
    新博客安家
    Win32设置与获取cookies的几种方法
    Win32 操作剪切板
    搜索PEB结构获取Kernel32.dll基址
    动人心魄音乐 [身骑白马 徐佳莹]
    单例模式与静态方法的区别(转载)
    个人回顾
    关于引入每日站会的思考
    2017年的总结和回顾
    《知易行难》回顾
  • 原文地址:https://www.cnblogs.com/taotaoblogs/p/7266952.html
Copyright © 2011-2022 走看看