beautufulsoup作为爬虫网页的解析库,凭借它的简单易懂得到了广泛的使用。下面以beautiful常用函数为例。
soup.title 打印标题,包括标签和文本。 soup.title.name 打印标题的标签。 soup.title.text 打印标题的文本。 soup.p 打印第一个p标签 soup.p.parent 打印第一个p标签的父标签内容,包括标签和文本 soup.p['class'] 查找第一个p标签中键值对的值。 soup.p.get('class') 在键值对中取值用.get('?'),也可以fingAll之后再get对应的值。 soup.find(id="?") 查找第一个id为符合条件的行,返回一个字符串。如果有id,那用该或下一{'id':'?'}都行(该id为beautifulsoup内置属性) soup.find(class_='?') 同上(该class_为beautifulsoup内置属性,与class类区分开) soup.find(attrs={'?':'?'}) 利用键值对(属性)去查 soup.find(name='?') 利用标签去查 soup.findAll(name=?1,attrs=?2) 查找所有name属性,返回一个列表。?1如img,?2如{"class":"picture"},name是该行的标签,attrs是该行的键值对。用法和#e相同
注意以上为本文列出的函数,可以当总结看,不可运行,运行会报错。下面以搜狗百科“节节草”为例,讲解每一个参数:
import requests from bs4 import BeautifulSoup web = 'https://baike.sogou.com/v223998.htm?fromTitle=%E8%8A%82%E8%8A%82%E8%8D%89' headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39', 'cookie': 'ssuid=5240298496; SUV=001F4972785571B961800D5EF60C6903; wuid=AAHrKNKSOQAAAAqHQ2VeoAAAkwA=; SUID=3F605E70BE50A00A0000000061B62487; sg_client_ip=120.85.113.181; uname=sg_85db9bd2e6030faac6e3b0aa; SGINPUT_UPSCREEN=1670913632956; cuid=AAG78+VCQwAAAAqHS2VFAgIANgg=; scssuid=7153297795; ABTEST=3|1681531092|v17; SNUID=A6A99F092421DD73D34D7484249A2FE3; IPLOC=CN'} params = {'fromTitle': '节节草'} req = requests.get(url=web,headers=headers,params=params) soup = BeautifulSoup(req.text,'html.parser') print(soup)
这里先定义soup,方便后面查看参数的效果。该段代码也不用复制去运行,因为服务器对用户的cookie是会过期的,一旦过期,cookie是无效的,自然运行也就会报错了。如果有小伙伴不懂上面代码的意思,可以看我爬虫的文章(可能还没更新),可以扫除你的大部分障碍。如果遇到no model named xxx ",需要下载该库,win+R打开cmd,输入pip install xxx。如果还有问题,可能是环境变量没有配置好。
可以看到,输出结果包含了标签
输出了标签title
这里不多说,一眼便懂。我们获取到的网页含有大量的标签和文本,我们要获取文本,要先定位到标签,那么我们如何定位标签呢?假如我们要定位到图中的
标签,并获取标签下的链接,有3种方法:
获取到了第一个
标签的标签及内容,接下来获取内容,假如我们要获取图5中第一行中href=...的内容,有两种方法,首先也是需要找到它对应的标签:
可以看到两种方法都能获取到内容。
假如我们想获取全部
标签,接下来演示。
注意,name='p'中的p为标签,假如想获取标签,那就name='div'。其他参数:id,class_,attrs。若想要查找的内容中含有id或者class_,可以直接用它。如下图含class标签:
也可用attrs进行定位(假如不含id和class时,该方法很有效)
如果你对上面的内容觉得比较乱,没关系,一般用的不多。下面查找全部标签的案例用的最多。
fi = soup.findAll(name='a',class_='ed_inner_link',attrs={'target':'_blank'}) for i in fi: print(i) print('-'*70)
把标签中class属性为ed_inner_link,且target属性为_blank的行提取出来,也可以自行减少参数,查到更多符合的条件。注意如果不是id,name,或者class,把它们全部放入attrs字典中。注意代码中写的是class_,而不是class。因为在python中class有特殊的含义,为定义一个类。
可以说,掌握soup.findAll(id='?',class_='?',name='?',attrs={}) 即可满足几乎所有的需求。