Python爬虫(四)——正则表达式

前三节我们基本掌握了抓取整个⽹⻚的基本技能,但是,还是第一节说的话,大多数情况下, 我们并不需要整个⽹⻚的全部内容,而是仅仅其中一小部分。在抽丝剥茧,挑出最需要的那部分数据时就需要合理利用一些数据提取工具,常用且非常好用的3个解析工具隆重出场。
1. re解析,又叫正则表达式,这个很重要,可以做几乎所有你想解析的事情,难度也最大;
2. bs4解析,如果说re是常规手段解决问题,那么bs4就是利用灵巧的手段解决部分具体问题;
3. xpath解析,那就再灵活一点,代码短了,但是理解起来也会难度大一点。
接下来我会详细介绍一下这三种解析方式。


1.1 正则表达式(regular expression)

 

一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。简而言之,⼀种使⽤表达式的⽅式对字符串进⾏匹配的语法规则。我们抓取到的⽹⻚源代码本质上是⼀个超⻓的字符串,正则表达式正是对字符串进行加工处理,抽取解析的一大利器。所以,学会编写正则表达式的逻辑关系是重点。


1.2构造正则表达式

构造正则表达式的方法和创建数学表达式的方法一样。通过多种元字符与运算符将多个小运算组合成一个大运算。那么我先介绍下有一些常用的元字符。

 . 匹配除换⾏符以外的任意字符
\w 匹配字⺟或数字或下划线
\s 匹配任意的空⽩符
\d 匹配数字
\n 匹配⼀个换⾏符
\t 匹配⼀个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
() 匹配括号内的表达式,也表示⼀个组
* 重复零次或更多次
? 重复零次或⼀次


不同的元字符之间还可以组合使用,其中贪婪匹配和惰性匹配是常用的两个组合。

.* 贪婪匹配
.*? 惰性匹配


举个例子

我在家读一本散文集《我与地坛》,妈妈正准备用坛子腌蒜。
正则:我.*坛

匹配结果:我在家读一本散文集《我与地坛》,妈妈正准备用坛

正则:我.*?坛

匹配结果:我在家读一本散文集《我与地坛

1.3 运算优先级
这个我就不详细说了,给大家一个网站

https://www.runoob.com/regexp/regexp-operator.html

1.4 re模块


说这么多肯定有小伙伴想问,怎么在python中写啊。
这又要依赖一个模块,re模块。
说一下几个常用的功能。

re.findall 查找所有符合匹配规则的, 返回list;
re.search 查找第一个符合匹配规则的;
re.finditer 查找所有符合匹配规则的,返回的是迭代器(重点);
re.compile 把⼀个⻓⻓的正则表达式预加载, ⽅便以后使⽤

1.5 梦斩天龙

这个例子是我精心准备的。我特别喜欢Bing这个搜索引擎,其中很大部分是因为它的首页背景图特别好看,而且往往会带一点小故事。所以,我的电脑桌面也是从它上面弄出来的。我在网上找了找代码,发现出乎意料的是竟然没人选择用正则去爬,这是非常符合正则标准的一个网页,代码放在下面了,欢迎大家指点。

import requests
import re

url = "https://cn.bing.com"
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}
resp = requests.get(url,headers=headers)


# print(resp.text)
page_content = resp.text
obj = re.compile(r'href="h(?P<name>.*?)" as="image"', re.S)
result = obj.finditer(page_content)
for it in result:
    ur = it.group("name")
    image= "h"+ur
    print(image)
    # 下载图片
    img_resp = requests.get(image)
    # img_resp.content  # 这里拿到的是字节
    img_name = "Bing背景图.jpg"  
    with open("img/" + img_name, mode="wb") as f:
        f.write(img_resp.content)  # 图片内容写入文件

    print("over!!!", img_name)


我本打算继续往下写的,发现不知不觉写了1700多字了,再多大家就失去阅读兴趣了,bs4下一章在写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值