Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序.Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,仅仅需要说明一下原始编码方式就可以了
1.安装
pip install beautifulsoup4
pip install bs4
pip install lxml
2.三大对象
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag:通俗点讲就是 HTML 中的一个个标签,例如:
<div>
<title>
- NavigableString,
print(soup.title.string) print(soup.title.text)
- Comment:Comment 对象是一个特殊类型的 NavigableString 对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦
bs4中.string和.text 的区别
1. 在指定标签td,没有子标签,且有文本时,两者的返回结果一致,都是文本
2. 在指定标签td,没有子标签,且没有文本时,.string返回None,.text返回为空
3. 在指定标签td,只有一个子标签时,且文本只出现在子标签之间时,两者返回结果一致,都返回子标签内的文本
4 .最关键的区别,在指定标签td,有子标签,并且父标签td和子标签p各自包含一段文本时,两者的返回结果,存在很大的差异
.string返回为空,因为文本数>=2,string不知道获取哪一个
.text返回的是,两段文本的拼接。
3.find_all方法使用
3.1字符串
传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容
3.2正则表达式
传入正则表达式作为参数,Beautiful Soup会通过正则表达式的 match() 来匹配内容
3.3列表
传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回
3.4keyword
传入一个id 的参数,Beautiful Soup会搜索每个tag的”id”属性
3.5True
True 可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
4.css方法使用
from bs4 import BeautifulSoup
from bs4.element import Comment
html='''
<title>尚学堂</title>
<div class='info' float='left'>Welcome to SXT</div>
<div class='info' float='right'>
<span>Good Good Study</span>
<a href='www.bjsxt.cn'></a>
<strong><!--没用--></strong>
</div>
'''
bs=BeautifulSoup(html,'lxml')
print('------获取标签-----')
print(bs.title)
print(bs.div)
print(bs.span)
print('------获取属性-----')
print(bs.div.attrs)
print(bs.a.get('href'))
print(bs.a['href'])
print('------获取内容-----')
print(bs.title.string)
print(bs.title.text)
print(bs.div.string)
print(bs.div.text)
print(bs.a.string)
print(bs.a.text)
print(bs.strong.string)#提取可用内容
print(bs.strong.text)#解析标签
print(type(bs.strong.string))
print(type(bs.strong.text))
print('------打印注释完整内容-----')
if type(bs.strong.string)==Comment:
print(bs.strong.prettify())
5.bs4_实战
import requests
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
url='http://www.people.com.cn/'
hearders={'UserAgent': UserAgent().chrome}
response=requests.get(url, headers=hearders)
response.encoding='gbk'
with open('temp.html','w',encoding='utf-8') as f:
f.write(response.text)
bs=BeautifulSoup(response.text,'lxml')
inf=bs.select('div[class="xinwen"] > ul >li >a')
for i in inf:
print(f'{i.text}==={i.get("href")}')