Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归
纳为4种:
beautiful soup简单使用
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser") #缩进格式
print(bs.title) # 获取title标签的名称及其内容
print(bs.title.name) # 获取title标签名称
print(bs.title.string) # 获取title标签的文本内容
print(bs.head) # 获取head标签及其中的所有内容
print(bs.a) # 获取第一个a标签中的所有内容
for item in bs.find_all("a"):
print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"):
print(item.get_text()) # 获取所有的a标签,并遍历打印a标签的文本值
1.Tag 标签及其内容;拿到它所找到的第一个内容
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")
print(bs.title.string)
print(type(bs.title.string))
对于 Tag,它有两个重要的属性,是 name 和 attrs:
简单用法
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")
print(bs.name) # [document] #bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.head.name) # head #对于其他内部标签,输出的值便为标签本身的名称
print(bs.a.attrs) # 在这里,把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a['class']) # 等价 bs.a.get('class')
bs.a['class'] = "newClass" # 可以对这些属性和内容等等进行修改
print(bs.a)
del bs.a['class'] # 还可以对这个属性进行删除
print(bs.a)
2.NavigableString 标签里的内容(字符串)
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(bs.title)
print(bs.title.string)
print(type(bs.title.string))
3.BeautifulSoup
BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性
from bs4 import BeautifulSoup
file = open("./baidu.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(bs.name)
print(type(bs.name))
print(bs.attrs)
print(bs.a.string)
print(type(bs.a.string))
4、Comment (内容)
Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号
from bs4 import BeautifulSoup
file = open('./baidu.html',"rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(bs.a)
# a标签如下:
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
print(bs.a.string) # 新闻
print(type(bs.a.string))
文档的遍历
1 .contents:获取Tag的所有子节点,返回一个list
print(bs.head.contents)
print(bs.head.contents[1])
2 .children:获取Tag的所有子节点,返回一个生成器
for child in bs.body.children:
print(child)
其他同理
.contents | 获取Tag的所有子节点,返回一个list |
.children | 获取Tag的所有子节点,返回一个生成器 |
.descendants | 获取Tag的所有子孙节点 |
.strings | 如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历 |
.stripped_strings | 与strings用法一致,只不过可以去除掉那些多余的空白内容 |
.parent | 获取Tag的父节点 |
.parents | 递归得到父辈元素的所有节点,返回一个生成器 |
.previous_sibling | 获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符 |
.next_sibling | 获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符 |
这是我个人觉得重要的,不够再补充
文档的搜索
1,find_all() #找到所有
字符串过滤:会查找与字符串完全匹配的内容 输出在一个列表中
t_list = bs.find_all("a")
print(t_list)
正则表达式过滤:如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容
按照标签来找内容,标签里面有就把标签及其内容打印输出
t_list= bs.find_all(re.compile("a"))
print(t_list)
方法 : 传入一个函数(方法),根据函数的要求来搜索 (功能强大)可以自己定义方式查询
def name_is_exists(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
print(item)
2.kwargs 参数
可以指定就想找到谁
t_list= bs.find_all(id="head")
for item in t_list:
print(item)
若参数名与系统关键字一样,可以加’_‘区分如 class_=true
3.text 参数
通过text参数可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受 字符串,正则 表达式,列表
t_list = bs.find_all(text =["hao123","地图","贴吧"])
for item in t_list:
print(item)
4.limit 参数
限制获取多少个数据
t_list = bs.find_all("a",limit=2)
for item in t_list:
print(item)
css选择器
在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag
t_list = bs.select('title') | #通过标签来查找 |
t_list = bs.select(".mnav") | #通过类名来查找 |
t_list = bs.select("#u1") | #通过id来查找 |
t_list = bs.select("a[class='bri']") | #通过属性来查找 |
t_list = bs.select("head > title") | #通过子标签来查找 |
t_list = bs.select(".mnav ~ .bri") | #通过兄弟节点标签查找 |
获取内容
t_list = bs.select('title') #通过标签来查找
for item in t_list:
print(item)
print(t_list[0].get_text())
小记
With in-depth study, I feel more and more that my brain is not enough and it is a little hard. I have to search the relevant information on the Internet repeatedly.But it's not a loss .When I look for information, it also deepens my understanding of this it.