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')]