Beautiful Soup4语法讲解使用

Beautiful Soup4提取HTML内容,一般要经过两步:首先处理源代码生成BeautifulSoup对象。然后使用find_all()或者find()来查找内容。

目录

页面示例

1.解析源代码

2.查找内容


页面示例

打开BS4练习页面,网页的源代码如图所示,直接使用requests获取源代码。

1.解析源代码

读取文件内容

def mo_ni_html(file_name):
    """ 模拟获取网页 """
    with open(file_name, 'r', encoding='utf-8') as f:
    detail = f.readlines()
    content = ''
    content = content.join(detail)
    return content

解析源代码生成BeautifulSoup对象,使用以下代码:

soup = BeautifulSoup('网页源代码', '解析器')

这里的“解析器”,可以使用html.parser:

soup = BeautifulSoup(html, 'html.parser')

如果安装了lxml,还可以使用lxml:

soup = BeautifulSoup(html, 'lxml')

2.查找内容

查找内容的基本流程和使用XPath非常相似。

首先要找到包含特殊属性值的标签,并使用这个标签来寻找内容。

假设需要获取“列表”,由于这个信息所在<div>标签的class属性的值为“news-title”,

这个值本身就很特殊,因此可以直接通过这个值来进行定位,如图所示。

运行结果如上图所示。

由于HTML中的class属性与Python的class关键字相同,因此为了不产生冲突,

BS4规定,如果遇到要查询class的情况,使用“class_”来代替。

在第20行的查询HTML代码中,class属性的属性值为“news-title”的标签,

得到find()方法返回的BeautifulSoup Tag对象。

在第22行中,直接通过.string属性就可以读出标签中的文字信息。

那如果要获取“图集1”“图集2”和“图集3”,又应该怎么办呢?使用先抓大再抓小:

videos_listb = soup.find(class_='videos-listb')
ul_h2s = videos_listb.find_all('h2')
for item in ul_h2s:
    print(item.string)

运行结果如下:

首先根据标签<div class="videos-listb">查找到有用的内容,

然后在这个内容的基础上继续查找<h2>标签下面的内容。

这里用到了find()方法和find_all()方法。

find()与find_all()的不同点如下。

· find_all()返回的是BeautifulSoup Tag对象组成的列表,

如果没有找到任何满足要求的标签,就会返回空列表。

· find()返回的是一个BeautifulSoup Tag对象,如果有多个符合条件的HTML标签,

则返回第1个对象,如果找不到就会返回None。

find_all()与find()的参数完全相同,以find_all()为例来说明。

find_all(name, attrs, recursive, text, **kwargs)

· name就是HTML的标签名,类似于body、div、ul、li。

· attrs参数的值是一个字典,字典的Key是属性名,字典的Value是属性值,例如

attrs={'class': 'videos-listb'}

这种写法,class就不需要加下划线。

· recursive的值为True或者False,当它为False的时候,BS4不会搜索子标签。

· text可以是一个字符串或者是正则表达式,用于搜索标签里面的文本信息,

因此,要寻找所有以“图集”开头的信息,还可以使用下面的写法:

content = soup.find_all(text=re.compile('图集'))

for item in content:

    print(item.string)

运算结果如图所示:

 

使用re时要注意,记得引入三方库re

import re

 除了获取标签里面的文本外,BS4也可以获取标签里面的属性值。

如果想获取某个属性值,可以将BeautifulSoup Tag对象看成字典,将属性名当作Key,

如图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值