Python爬虫之”靓汤“(beautiful soup)

本文详细介绍了BeautifulSoup4库在解析HTML文档中的应用,包括Tag、NavigableString、BeautifulSoup和Comment四种主要对象的使用。通过实例展示了如何获取标签内容、属性,遍历文档结构,以及使用find_all()方法进行搜索过滤。同时,还讲解了如何使用CSS选择器进行文档搜索。通过对文档的深入学习,加深了对HTML解析和文档操作的理解。
摘要由CSDN通过智能技术生成

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 通俗点讲就是 HTML中的一个个标签, 我们可以利用 soup 加标签名轻松地获取这些标签的内
容,这些对象的类型是 bs4.element.Tag。但是 注意,它查找的是在所有内容中的第一个符合要求
的标签。

对于 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  标签里的内容(字符串)

得到了标签的内容,要想获取标签内部的文字,用.string 即可
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() #找到所有

find_all 的更多用法 -过滤器。这些过滤器贯穿整个搜索 API ,过滤器可以被用在 tag name 中,节点的属性等。

字符串过滤:会查找与字符串完全匹配的内容   输出在一个列表中

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onlywishes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值