优点: 速度快,效率高,准确性高正则的
缺点: 新手上手难度有点儿高
https://www.mklab.cn/utils/regex
https://tool.oschina.net/regex/
. 匹配除换行符以外的任意字符, 未来在python的re模块中是一个坑
\w匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
alb 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[…] 匹配字符组中的字符
[^…]匹配除了字符组中字符的所有字符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
.* 尽可能多的匹配
惰性匹配
.*? 尽可能少的匹配 ->回溯
import re
# findall直接返回匹配结果,以列表形式返回
res = re.findall(r"\d+","我今年28岁了,我有100万")
print(res)
# 迭代器
res1 = re.finditer(r"\d+","我今年28岁了,我有100万")
for item in res1: #从迭代器中拿到内容
print(item.group()) #从匹配结果中拿到数据
# 只能匹配到第一次匹配的内容
res2 = re.search(r"\d+","我今年28岁了,我有100万")
print(res2.group())
#从开头开始匹配
res3 = re.match(r"\d+","我今年28岁了,我有100万")
print(res3)
#预加载,提前把正则对象加载完毕
obj = re.compile(r"\d+")
#使用加载好的正则
res4 = obj.findall("我有100元,借给你50元")
print(res4)
#单独匹配字符串的内容,用()可以单独取名字
#匹配内容分组 ?p .group(id)
obj = re.compile(r"(?P.*?) ")
res = obj.finditer(s)
for item in res:
print(item.group("id"))
import re
from openpyxl import Workbook
import requests
lst = []
for i in range(10):
url = f"https://movie.douban.com/top250?start={i*25}&filter="
heads = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
resp = requests.get(url=url,headers=heads)
pageSource = resp.text
obj = re.compile(r'.*?(?P.*?) '
r'.*?导演: (?P.*?) .*?'
r'
.*?(?P.*?) .*?'
r'property="v:average">(?P.*?) .*?'
r'(?P.*?)评价 ',re.S)
res = obj.finditer(pageSource)
for item in res:
ls = [item.group('move_name'), item.group('director'), item.group('year').strip(), item.group('score'),item.group('person_number')]
lst.append(ls)
wb = Workbook()
ws = wb.active
head = ["电影名","导演","拍摄年份","电影评分","评价人数"]
ws.append(head)
for i in lst:
ws.append(i)
wb.save('豆瓣top250.xlsx')
如果数据存在多层,可以分段爬取
3. BeautifulSoup数据提取
from bs4 import BeautifulSoup
html = """
"""
# 初始化BeautifulSoup
page = BeautifulSoup(html,"html.parser")
#获取标签
li = page.find("li",attrs={"id":"100"})
print(li)
#获取标签的之
print(li.text)
#获取标签属性
herf = li.find("a").get("herf")
print(herf)
4. xpath提
代码
from lxml inport etree
from lxml import import html
etree = html.etree
'''
//text() 提取标签下所有的文本
./ 当前目录下
./[@class="*"]/ 获取class属性为\*的标签下的数据
./a[1] 获取当前目录下第一个a标签
'''
5. PyQuery解析
pip install pyquery
pyquery数据解析
from pyquery import PyQuery
p = PyQuery(html)
# 链式操作
# 提取div中的li
a = p("div")("li")
a = p("li a")
#1. 根据class属性筛选
a = p(".属性 a")
#2. 根据id筛选
a = p("#aaa a")
#3. 提取数据中的属性
h = p("").attr("属性")
#4. 提取数据
t = p("").text()
#5. 拿到标签下所有的标签
it = p("").items()
for i in it:
print(i.attr(),i.text())
pyquery修改页面数据
# 1. 在xx标签后面添加新标签
p = PyQuery(html)
p("div.aaa").after(PyQuery"""""")
# 2. 在标签里面添加
p("div.aaa").append("""""")
# 3. 修改标签属性
p("div.aaa").attr("class","xx")
# 4. 新增属性
p("div.aaa").attr("class","xx")
# 5. 删除属性
p("div.aaa").remove_attr("id")
# 6. 删除标签
p("div.aaa").remove()
#获取div下第一个dl标签的d标签,的第一个d标签的之
p("div>dl:nth-child(1)>d").eq(0).text()
str.replace("old","new")
#判断div的dl下是否包含xx
p(""div>dl:contains("包含的内容")")