使用正则表达式,首先需要导包:
import re
贪婪匹配
比如,这句html代码,需要匹配<html>
s = "<html><title>i am a good boy</title></html>"
贪婪搜索直接把整个代码全部匹配
print(re.search(r"<.+>", s))
<re.Match object; span=(0, 43), match='<html><title>i am a good boy</title></html>'>
在+ 后面添加 ? 就不会一直搜索
print(re.search(r"<.+?>", s))
<re.Match object; span=(0, 6), match='<html>'>
\A \Z \b
\A 相当于 ^ :匹配输入字符串开始的位置
\Z 相当于 $ :匹配输入字符串的结束位置
\b 匹配一个单词的边界,符号和括号属于单词的边界,而_下划线不属于
print(re.findall(r"\bfish\b", "fish.com!fish_big!(fish)"))
['fish', 'fish']
\B :和\b相反,不匹配单词边界,比如py\B,只匹配 python ,py3 ,不会匹配py py. py!
\d :匹配任何一个数字
search 方法
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字 等价于 ‘[^A-Za-z0-9_]’。
result = re.search(r" (\w+) (\w+)","i love myself")
print(result) # love myself
print(result.group(0)) # love myself
print(result.group(1)) #love
print(result.group(2)) #myself
较为常用的元字符包括: “+”, “*”,以及 “?”。
“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
爬虫必须背的代码:
import urllib.request
import urllib.error
import os
def url_open(url):
# 设置文件头
header = {"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"}
req = urllib.request.Request(url, headers=header)
# 现在开始访问
try:
response = urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read())
html = response.read()
return html
def get_image(html):
p = r'<img src="([^"]+\.jpg)"'
imglist = re.findall(p,html.decode('utf-8'))
for each in imglist:
print(each)
# for each in imglist:
# filename = each.split('/')[-1]
# urllib.request.urlretrieve(each,filename)
if __name__ == '__main__':
url = 'https://img.022gan.com/post/17265.ml'
get_image(url_open(url))
异常处理
# http的状态码,状态码为100~299 的范围表示成功。
# # 400~499:表示是客户端出了问题。
# # 500:表示服务端出了问题
# # 403:Forbidden 服务器已经理解请求,但是拒绝执行
import urllib.request
import urllib.error
req = urllib.request.Request("http://www.fichc.com/ooxx.html")
try:
urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read())