从零开始爬虫系统学习Day3——2021.2.24

回顾

最近几天一忙又耽误了,看来一定要平衡好时间安排(但是现在这个临近毕业的节点真的焦虑)。一想到这里就觉得,我关注的这些日更长文的个人公众号的运营者是真的厉害,在有本职工作的情况下还能够坚持下去,并且内容质量也是越来越高、越来越稳定,要加油了!
接下来要开始新的一章学习,坚持一定有收获!!

声明

接下来的部分内容会使用一些来自《O‘REILLY——Python网络爬虫权威指南》上的实例配合记录,虽说我的这次系统学习参考了很多方面的内容,但是只有这本书允许了个人使用作者提供的样例

今日记录

一、find_all的使用方式(入门)与传参说明

1.1 find_all()使用例

本例使用书中网站

http://www.pythonscraping.com/pages/warandpeace.html
在这里插入图片描述

使用例及说明(说明为备注形式):

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('http://www.pythonscraping.com/pages/warandpeace.html')
bs = BeautifulSoup(html.read(),'html.parser') #建立bs对象
nameList = bs.find_all('span',{'class':'green'}) #根据css样式层进行拆分
for name in nameList:
    print(name.get_text())

其中

nameList = bs.find_all('span',{'class':'green'}) 
for name in nameList:
    print(name.get_text())

for name in bs.find_all('span',{'class':'green'}):
    print(name.get_text())

但需要注意的是,虽然效果相同,书中也有描述,但是后者运行时间极长(使用PyCharm Community 最新win版),原因未知,欢迎大佬解答。

1.2 find_all()传参说明

在bs官方文档里是这样描述的:

find_all(tag, attributes, recursive, text, limit, keywords)

其中,常用参数为前三个,它们的作用分别是:

  • tag:传递一个标签的名称或多个标签名称组成的Python 列表做标签参数。
  • attribute:用一个 Python 字典封装一个标签的若干属性和对应的属性值。
  • recursive:一个布尔变量,如果 recursive 设置为 True,find_all 就会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。默认值为TRUE。
  • text:寻找包含text内容的标签数量
  • limit:限制输出范围,当limit值为1的时候,与find()函数没有区别
  • keyword:关键词参数 keyword,可以让你选择那些具有指定属性的标签。
    • title = bs.find_all(id='title', class_='text')
    • 需要注意的是,class为Python的关键字,传参时可以使用class_='text'

二、正则表达式(基于Python规则)

这里记录几个以前常用的规范:

  1. 在使用. \ |的时候,需要在前面加上\转译
  2. *表示该符号前的字符会进行任意次匹配
  3. +表示该符号前的字符要至少出现一次
  4. ()用于编组,优先级最高
  5. |匹配任意一个有该符号分割的字符或子表达式,常与()一起使用,如b(a|i|e)d,则bad、bid、bed都符合匹配。
  6. []匹配符号内任意一个字符,如[A-Z]。当然也可以复合使用,如[A-Za-z]
  7. .匹配任意字母、空格、符号、数字。如b.d,bed、b d、b.d都可以通过匹配,这也是为什么.作为匹配内容出现时需要前加\转译

以邮箱地址匹配为例,假如规则是这样的:

  1. 邮箱地址的第一部分至少包括一种内容:大写字母、小写字母、数字 0-9、点号(.)、加号(+)或下划线(_)
  2. 第一部分后必须衔接一个@
  3. 在符合 @ 之后,邮箱地址还必须至少包含一个大写或小写字母
  4. 之后跟一个点号(.)
  5. 最后邮箱地址用 com、org、edu、net 结尾(实际上,顶级域名有很多种可能,但是作为示例演示这 4 个后缀够用了)

那么根据要求,可以分别将其转化为正则表达式描述(下面描述序号与邮箱要求序号一一对应):

  1. [A-Za-z.+_]+
  2. @
  3. [A-Za-z]+
  4. \.
  5. (com|org|edu|net)
    - 以前曾经错写成[com|org|edu|net](com|org|edu|net)+这两种都是错误的方式,以后要多注意

那么最后将符合每一项要求的正则表达式拼接在一起之后就是最终的结果:[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)

反思:之前之所以写错的原因有两点,一方面是没有经验,没能实践中理解正则规范;另一方面是,面对一个要完成的项目,事先没有先分析,更没有根据分析列清需求,直接就开始着手写代码,导致结果解释需要更多的时间修正错误,并且修正后的结果也会缺失细节。

三、补充

Python字典

(runnoob实例)官方称之为是一种可变容器模型,且可存储任意类型对象,是一种数据结构,使用方式如dict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}
我个人的理解是,数据形式上和json类似,但是字典支持任意类型对象,而json只能以字符串形式记录。

网页的id属性

对于允许使用id属性描述的标签,具有多种功能。我找到了一个详细记录描述的网站:php中文网id属性描述,里面结合实例对id属性进行了详细描述。由于之前写网页的时候没在意过这些,所以不进行总结。

for……in……循环

就如同前面记录的一样,如过在in后面直接加会返回结果的执行语句,会导致运行效率受到很大影响。但如果提前用变量获取执行语句结果就会好得多。这里的原因暂时未找到,但是在书中描述应该是执行一致的,希望有知道的大佬可以解答一下原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值