鱼C论坛

 找回密码
 立即注册
查看: 1481|回复: 15

[已解决]060论一只爬虫的自我修养8:正则表达式4 关于脱字符^的疑问

[复制链接]
发表于 2019-10-10 15:01:58 | 显示全部楼层 |阅读模式
10鱼币
  1. import re
  2. s = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600"><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600">'
  3. result = re.findall(r'<img class="BDE_Image" src="[^"]+\.jpg', s)
  4. print(result)

  5. 结果:
  6. ['<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg', '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg']
复制代码
疑问:[^"]表示除了双引号以外的字符,
得到的结果jpg后面的都没有了:" size="57323" width="450" height="600"
为什么不是:
['<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg size=57323 width=450 height=600 后面略]

或者优化我自己写的:
  1. import re
  2. s = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600"><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600">'
  3. result = re.findall(r'<img class="BDE_Image" src=".+\.jpg', s)
  4. print(result)

  5. 结果:
  6. ['<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600"><img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg']
复制代码
结果是最后一个图片路径后面没有size,width, height,但前面有,怎么优化?
结论就是,看不懂小甲鱼老师写的那句,有小伙伴指点一下吗?


最佳答案
2019-10-10 15:01:59
yanner 发表于 2019-10-11 09:06
遇到双引号结束,
对,结果看到是这样的,就是不知道为啥有这个效果,小甲鱼老师说:[^"]表示除了双引号 ...

1. 是把匹配的内容提取出来,不是把不匹配的去掉。
2. 该正则表达式还要求双引号前面是jpg.
3. 也就是说以<img class="BDE_Image" src=" 开头,后边的只要不是双引号就匹配,碰到双引号就匹配结束,并且并且双引号前面必须是 .jpg

最佳答案

查看完整内容

1. 是把匹配的内容提取出来,不是把不匹配的去掉。 2. 该正则表达式还要求双引号前面是jpg. 3. 也就是说以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 15:01:59 | 显示全部楼层    本楼为最佳答案   
yanner 发表于 2019-10-11 09:06
遇到双引号结束,
对,结果看到是这样的,就是不知道为啥有这个效果,小甲鱼老师说:[^"]表示除了双引号 ...

1. 是把匹配的内容提取出来,不是把不匹配的去掉。
2. 该正则表达式还要求双引号前面是jpg.
3. 也就是说以<img class="BDE_Image" src=" 开头,后边的只要不是双引号就匹配,碰到双引号就匹配结束,并且并且双引号前面必须是 .jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 15:16:56 | 显示全部楼层
>>> result = re.findall(r'<.+?>', s)
>>> result
['<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600">', '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600">']

评分

参与人数 1鱼币 +1 收起 理由
yanner + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-10 16:07:17 | 显示全部楼层
wp231957 发表于 2019-10-10 15:16
>>> result = re.findall(r'', s)
>>> result
['', '']


第一个是小甲鱼老师写的是要提取的图片路径,但我不理解。
第二个是我自己写的,达不到提取图片路径的后果,中间还是有,大小宽高的属性。你这个,中间和结尾都有大小宽高的属性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 16:56:21 From FishC Mobile | 显示全部楼层
yanner 发表于 2019-10-10 16:07
第一个是小甲鱼老师写的是要提取的图片路径,但我不理解。
第二个是我自己写的,达不到提取图片路径的 ...

你想要哪部分数据呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-10 17:03:33 | 显示全部楼层
wp231957 发表于 2019-10-10 16:56
你想要哪部分数据呢

['<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg', '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg']

就是这样的结果哦,第一段的写法是对的(小甲鱼老师的写法),只是我不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 17:24:35 | 显示全部楼层
本帖最后由 kaohsing 于 2019-10-10 17:52 编辑

import re
s = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3ef11f7aa0.jpg" size="57323" width="450" height="600">' \
    '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/f7aa0.jpg" size="57323" width="450" height="600">'
result = re.findall(r'<img class="BDE_Image" src="[^"]+\.jpg', s)
print(result)

# src="[^"]+\.jpg   这个表示以src="开头  以\.jpg结尾的遇到双引号就结束.,jpg"以后的就匹配不上.

评分

参与人数 1鱼币 +2 收起 理由
yanner + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 17:58:06 | 显示全部楼层
  1. import re
  2. s = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0cf11f7aa0.jpg" size="57323" width="450" height="600">' \
  3.     '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4f11f7aa0.jpg" size="57323" width="450" height="600">'
  4. result = re.findall(r'<img class="BDE_Image" src=".+\.jpg', s)
  5. print(result)

  6. #  src=".+\.jpg'  这个[b][size=5]表示src=“后面是任意字符,直到遇到jpg结束[/size][/b] ,运行下面的语句可以实验一下

  7. s = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0cf11f7aa0.jpg" size="57323" width="450" height="600">' \
  8.     '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4f11f7aa0.jpg" size="57323" width="450" height="600">'\
  9. '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0cf11f7aa0.jpg" size="57323" width="450" height="600">' \
  10.     '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4f11f7aa0.jpg" size="57323" width="450" height="600">'
  11. result = re.findall(r'<img class="BDE_Image" src=".+\.jpg', s)
  12. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 21:48:01 | 显示全部楼层
[^"]表示除了双引号以外的字符,你理解的非常正确
result = re.findall(r'src="[^"]+\.jpg',s)
print(result)
结果
['src="https://imgsa.baidu.com/forum/w%3ef11f7aa0.jpg', 'src="https://imgsa.baidu.com/forum/w%3D580/f7aa0.jpg']
其实  src="[^"]+\.jpg 主要表示以 src=" 开头去查找匹配,只要 src=" 后面不是双引号且结尾是.jpg 就可以匹配上,所以匹配不上 size="57323" width="450" height="600"

评分

参与人数 1鱼币 +2 收起 理由
yanner + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-11 05:49:54 | 显示全部楼层
  1. import re
  2. s  = '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.png" size="57323" width="450" height="600">'
  3. s += '<img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=0c4bc7595afbb2fb342b581a7f4b2043/3992a116fdfaaf51a67b4ebb835494eef11f7aa0.jpg" size="57323" width="450" height="600">'

  4. result = re.findall(r'<img class="BDE_Image" src="[^"]+\.jpg', s)
  5. # 上面的pattern是指以 <img class="BDE_Image" src=" 开头,遇到双引号结束, 并且双引号前面必须是 .jpg
  6. # 如果我们把第一个 img 文件改为 png, 它就不能匹配了。

  7. print(result)
复制代码

评分

参与人数 1鱼币 +2 收起 理由
yanner + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 09:00:08 | 显示全部楼层
kaohsing 发表于 2019-10-10 17:24
import re
s = '' \
    ''

# src="[^"]+\.jpg   这个表示以src="开头  以\.jpg结尾的遇到双引号就结束.,jpg"以后的就匹配不上.
对,结果看到是这样的,就是不知道为啥有这个效果,小甲鱼老师说:[^"]表示除了双引号以外的字符,这个说法和这个效果感觉匹配不上,不知道有没有关于这种情况的资料推荐呢,百度不知道怎么百度?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 09:04:29 | 显示全部楼层
xue11 发表于 2019-10-10 21:48
[^"]表示除了双引号以外的字符,你理解的非常正确
result = re.findall(r'src="[^"]+\.jpg',s)
print(res ...

只要 src=" 后面不是双引号且结尾是.jpg 就可以匹配上,
对,结果看到是这样的,就是不知道为啥有这个效果,小甲鱼老师说:[^"]表示除了双引号以外的字符,这个说法和这个效果感觉匹配不上,直接按这句话理解是,后面的 size="57323" width="450" height="600",中的双引号去掉啊?不知道有没有关于这种情况的资料推荐呢,百度不知道怎么百度?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 09:06:36 | 显示全部楼层

遇到双引号结束,
对,结果看到是这样的,就是不知道为啥有这个效果,小甲鱼老师说:[^"]表示除了双引号以外的字符,这个说法和这个效果感觉匹配不上,直接按这句话理解是,后面的 size="57323" width="450" height="600",中的双引号去掉啊?不知道有没有关于这种情况的资料推荐呢,百度不知道怎么百度?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 09:10:18 | 显示全部楼层

对的,这个理解,就是想在这个基础上看还能不能优化成和result = re.findall(r'<img class="BDE_Image" src="[^"]+\.jpg', s)这个效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-11 10:41:58 From FishC Mobile | 显示全部楼层
yanner 发表于 2019-10-11 09:10
对的,这个理解,就是想在这个基础上看还能不能优化成和result = re.findall(r'

不知要什吗内容?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-11 16:28:59 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-10 15:01
1. 是把匹配的内容提取出来,不是把不匹配的去掉。
2. 该正则表达式还要求双引号前面是jpg.
3. 也就是 ...

谢谢啊,通过下面的辅助理解“匹配”了,我太笨了
b = '<a href = "http://www.baidu.com">wang</a><a href = "http://www.baidu.com">wang</a>'
test = re.findall(r'<a href = "[^"]+', b)
test2 = re.findall(r'[^"]+', b)
print(test)
print(test2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表