鱼C论坛

 找回密码
 立即注册
查看: 2133|回复: 12

[已解决]Python爬虫相关基础问题

[复制链接]
发表于 2022-8-5 08:47:56 | 显示全部楼层 |阅读模式
25鱼币
Python爬虫相关内容
代码在下方,为什么上面那种写法的运行结果不会带有'<a href="xxxx">'两边的内容呢?而只是找出了其中的网址。findLink变量中存储的是正则表达式模板,findall函数在查找的时候不应该是按照正则表达式将其全部查找出来吗?为什么只有网址呢?
在下方还有两行测试代码,如果不加双引号和网址的正则表达式,则可以查找出'<a href=',这是为什么呢?findall函数的使用有什么注意事项吗?
  1. import re

  2. # 模板
  3. # findLink = re.compile(r'<a href="(.*?)">')
  4. # 输出:https://movie.douban.com/subject/1292052/

  5. findLink = re.compile(r'<a href=')
  6. # 输出:<a href=

  7. # 查找对象
  8. item = r'<a href="https://movie.douban.com/subject/1292052/">dfsafdsafdsa'

  9. # 查找
  10. link = re.findall(findLink, item)[0]
  11. print(link)
复制代码
最佳答案
2022-8-5 08:47:57
  1. re.findall('href=".*\/">', item)这种就带前后
  2. re.findall('href="(.*)\/">', item)这种就不带前后
  3. 加了()就有输出限定了
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-5 08:47:57 | 显示全部楼层    本楼为最佳答案   
  1. re.findall('href=".*\/">', item)这种就带前后
  2. re.findall('href="(.*)\/">', item)这种就不带前后
  3. 加了()就有输出限定了
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-5 09:33:38 | 显示全部楼层
给个完整版
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-5 10:36:03 | 显示全部楼层
如果网络允许静态爬虫的话,那么正则明显不如xpath有优势
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-5 22:31:50 | 显示全部楼层
第四行(.*?),所以输出的是这个括号里的内容,第七行是去找<a href=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-5 23:54:38 | 显示全部楼层
南归 发表于 2022-8-5 22:31
第四行(.*?),所以输出的是这个括号里的内容,第七行是去找

意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果正则表达式里面没有括号,再找其他的内容。原理是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-6 02:58:17 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2022-8-6 10:34 编辑
Buryool 发表于 2022-8-5 23:54
意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果 ...


可以参考:https://hankchow.github.io/2018/ ... brackets-in-Python/
如果不想匹配括号可以可以把 "?:" 加在第一个括号后面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-6 21:53:07 | 显示全部楼层
re.findall('href=\"(.*)\/">', item)
输出['https://movie.douban.com/subject/1292052']
<a href="(.*?)">写法直白点讲就是匹配并且只显示.*这部分,再直白说就是先匹配出<a href="到">之间的内容,然后只输出()里匹配的内容,如果不加()则显示完整的<a到>

re.findall('href=\".*\/">', item)
输出['href="https://movie.douban.com/subject/1292052/">']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-6 21:54:45 | 显示全部楼层
显示全部还是只显示链接,是是否有()决定的,没有()则显示所有,有()则根据()前后内容匹配但只输出()内的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-6 21:56:56 | 显示全部楼层
Buryool 发表于 2022-8-5 23:54
意思是说像这样用正则表达式匹配查找的时候,如果正则表达式里面有括号的话就找和括号里匹配的内容;如果 ...

你理解错了,是根据()前后内容查找,但是只输出()中匹配的部分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-6 22:03:26 | 显示全部楼层
另外提一句,要是元素清晰的话最好用css选择器,使用起来比正则轻松多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-7 08:49:16 | 显示全部楼层

懂了懂了!太感谢了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-7 08:50:37 | 显示全部楼层
liuzhengyuan 发表于 2022-8-6 02:58
可以参考:https://hankchow.github.io/2018/08/11/a-pitfall-of-re-findall-with-brackets-in-Python/ ...

已解决!非常感谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 01:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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