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 = """
周杰伦
林俊杰
蔡依林
林依晨
"""
# (?P正则表达式) 单独提取出某内容到分组中
# obj = re.compile(" .*?",re.S) #表示包括换行符在内的任意字符
obj = re.compile(" (?P.*?)",re.S) # (?P.*?) 表示.*?取出的值存分组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'.*?(?P.*?)'
r'.*?.*?(?P.*?)(?P.*?)',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'2023新片精品.*?(?P.*?)',re.S)
obj2 = re.compile(r"]",re.S)
obj3 = re.compile(r'◎译 名 (?P.*?)◎片 名 '
r'(?P.*?).*?',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()
|