re解析(正则表达式 )
从超长字符串中提取相应的内容。
优点:速度快、效率高、准确率高。
缺点:上手难。
语法:使用元字符进行排列组合匹配字符串。
元字符:具有固定含义的特殊符号。
常用元字符
量词:控制元字符出现的次数。
贪婪匹配:. 即尽可能多的匹配内容。
惰性匹配:.*? 即尽可能少的匹配内容。*
import re
# findall:匹配字符串中的符合正则表达式的内容,但效率低
lst = re.findall(r"\d+","第一:10010,第二:10086") #第一个参数为正则表达式(前面的r用于规范化),第二个参数为内容
print(lst)
# finditer:匹配字符串中所有的内容,返回迭代器,从迭代器拿到内容需要结果.group()
it = re.finditer(r"\d+","第一:10010,第二:10086")
print(it)
print("----------")
for i in it:
print(i)
print(i.group()) #用group取匹配到的内容
print("----------")
# search:全文匹配,只要检索有一个就返回match对象,用结果.group()显示
s = re.search(r"\d+","第一:10010,第二:10086")
print(s.group())
print("----------")
# match:从头匹配,有就返回match对象,用结果.group()显示,头不是就返回none
m = re.match(r"\d+","10010,第二:10086")
print(m.group())
print("----------")
#预加正则表达式
# obj = re.compile(r"\d+") #可反复使用
#
# ret = obj.finditer("第一:10010,第二:10086")
# for j in ret:
# print(j.group())
s = """
<div class='jay'><span id='1'>周杰伦</span></div>
<div class='jj'><span id='2'>林俊杰</span></div>
<div class='jolin'><span id='3'>蔡依林</span></div>
<div class='jk'><span id='4'>林依晨</span></div>
"""
# (?P<分组名字>正则表达式) 单独提取出某内容到分组中
# obj = re.compile(" <div class='.*?'><span id='.*?'>.*?</span></div>",re.S) #表示包括换行符在内的任意字符
obj = re.compile(" <div class='.*?'><span id='.*?'>(?P<name>.*?)</span></div>",re.S) # (?P<name>.*?) 表示.*?取出的值存分组name中
ret = obj.finditer(s)
for its in ret:
print(its.group())
print(its.group("name"))
例子:爬京东商城
import requests
import re
import csv
def getPage_content(page):
url = "https://search.jd.com/Search?keyword=手机pvid=f7d4325adc364c5aa375cbf619c218c6&page="+str(page)+"&s=116&click=0"
header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
resp = requests.get(url,headers=header)
page_content = resp.text
resp.close()
return page_content
def parse_page(page_content):
#解析数据
obj = re.compile(r'<div class="p-price">.*?<i data-price=".*?">(?P<price>.*?)</i>'
r'.*?<div class="p-name p-name-type-2">.*?<em>(?P<name>.*?)<'
r'.*?<span class="J_im_icon">.*?title=".*?">(?P<shopName>.*?)</a>',re.S)
result = obj.finditer(page_content)
return result
if __name__=='__main__':
f = open("phone.csv",mode='w',encoding='utf-8',newline="")
csvwriter = csv.writer(f)
for page in range(1,3):
page_content = getPage_content(page)
result = parse_page(page_content)
for it in result:
# print(it.group("name"))
# print(it.group("price"))
# print(it.group("shopName"))
# print(it.group("discounts1"))
# print(it.group("discounts2"))
# print("--------------------")
dic = it.groupdict()
csvwriter.writerow(dic.values())
f.close()
例子:爬电影天堂
import requests
import re
import csv
url = 'https://www.dytt8.net/index2.htm'
resp = requests.get(url)
# 手动设定响应数据的编码格式
resp.encoding = resp.apparent_encoding
page_content = resp.text
resp.close()
obj = re.compile(r'<div class="title_all"><p><strong>2023新片精品.*?<ul>(?P<ul>.*?)</ul>',re.S)
obj2 = re.compile(r"</a>]<a href='(?P<href>.*?)'>",re.S)
obj3 = re.compile(r'◎译 名 (?P<tname>.*?)<br />◎片 名 '
r'(?P<name>.*?)<br />.*?<a target="_blank" href="(?P<mlink>.*?)"><strong>',re.S)
result = obj.finditer(page_content)
domain = "https://www.dytt8.net"
linkList = []
for it in result:
ul = it.group("ul")
movies = obj2.finditer(ul)
for it2 in movies:
link = domain+it2.group("href")
linkList.append(link)
f = open("movie.csv",mode='w',encoding='utf-8',newline="")
csvwriter = csv.writer(f)
for href in linkList:
herfResp = requests.get(href,verify=False)
herfResp.encoding = 'gb2312' #设置编码charset
# print(herfResp.text)
downloadDic = obj3.search(herfResp.text).groupdict()
csvwriter.writerow(downloadDic.values())
herfResp.close()
f.close()