Beautiful Soup4提取HTML内容,一般要经过两步:首先处理源代码生成BeautifulSoup对象。然后使用find_all()或者find()来查找内容。
目录
页面示例
打开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,
如图所示: