BeautifulSoup学习

1. BeautifulSoup入门

这里写图片描述

from bs4 import BeautifulSoup
with open('index.html','r',encoding='UTF-8') as h:
    soup = BeautifulSoup(h)
    print(soup.prettify())

首先我自己做的时候有两个错误,第一个创建beautifulsoup对象的时候传入的不应该是那种url的链接,第二读取本地文件的时候会出现类似于gbk’ codec can’t decode byte 0x80 in position 90: illegal multibyte这种错误,这时候读文件的时候加上encoding就好啦
输出的结果是格式化了的网页代码

2.BeautifulSoup类的基本元素

将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归为:Tag,NavigableString,Comment**

Tag
①Tag就是最基本的标签,以<>开始

from bs4 import BeautifulSoup
# from bs4.diagnose import diagnose
with open('index.html','r',encoding='UTF-8') as h:
    # diagnose(h)
    soup = BeautifulSoup(h)
    # fixed_html = soup.prettify()
    print(soup.title)

我按照这种方式打印title的时候,弹出来一个警告,说是我现在没有定义解析器,然后系统默认用lxml来解析。搜了一下,我们可以用我上面注释掉的那句diagnose(h)来看看系统带的解析器有哪些。后续我都用了html.parser来解析。
此外还有print(soup.a.parent.name)这样类似的形式可以打印出a的父标签的名字。
②Tag的两个属性:name attributes
name也就是标签的名字,直接print(soup.li.name)就可以打印出来
attributes 就是这个标签含有哪些属性 print(soup.p.attrs) 打印出来的是字典形式的,也可以用例如print(soup.p.attrs['name'])打印其中某项属性的值。等价操作

print(soup.p.get('name'))
print(soup.p['name'])

当然你也可以想到可以修改里面的属性和值

soup.p['name'] = 'dro'
del soup.p['name']

NavigableString
标签内的非属性字符串<>…

print(soup.p.string)
print(type(soup.p.string))

可以看一下它的类型就是NavigableString
Comment
标签内字符串的注释部分如果直接用.string方法打印它会自动去掉两边的注释,这可能会给我们带来不必要的麻烦。
我们找一个带有注释的,比如说下面这个:

<b><!--This is a comment--></b>
<p>This is not a comment</p>

比如,我们用soup.b.string,输出的是this is a comment
type(soup.b.string),可以看出类型是bs4.element.Comment
下次我们就可以先判断类型再做下一步的操作啦 !
一个总结的图片:
这里写图片描述

3.基于bs4的HTML遍历方法

分为上行遍历、下行遍历和平行遍历

下行遍历

.contents 以列表的方式输出tag的子节点

print(soup.head.contents)

输出结果

[<title>The Dormouse's story</title>]

我们也可以用列表索引来获取它的某一项。

.children 子节点的迭代类型,用于循环遍历儿子节点

for child in soup.body.children:
    print(child)

.descendants 子孙节点的迭代类型,

for child in soup.descendants:
    print(child)

上行遍历

.parent
节点的父类标签

print(soup.p.parent.name)

.parents
节点先辈标签的迭代类型

for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

结果:

p
body
html
[document]

平行遍历

.next_sibling 返回按照html顺序的下一个平行节点标签
.prev_sibling返回按照html顺序的上一个平行节点标签
实际文档中的tag的 .next_sibling 和 .previous_sibling 属性通常是字符串或空白,因为空白或者换行也可以被视作一个节点,所以得到的结果可能是空白或者换行

print(soup.p.next_sibling.next_sibling)

.next_siblings 迭代类型
.prev_siblings 迭代类型

for sibling in soup.p.next_siblings:
    print(sibling)

基于bs4库的格式化和编码

import requests
from bs4 import BeautifulSoup
req = requests.get("http://python123.io/ws/demo.html")
print(req.text)
demo = req.text
soup = BeautifulSoup(demo,'html.parser')
print(soup.prettify())

基于bs4库的HTML内容查找方法

find_all(name,attrs,recursive,string,**kwargs)
name:
①可以传入字符串。如果给定的值是True则会打印全部内容

print(soup.find_all('a'))
for tag in soup.find_all(True):
    print(tag.name)

输出结果:

[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]
html
head
title
body
p
b
p
a
a

②可传入正则表达式

for tag in soup.find_all(re.compile('^b')):
    print(tag.name)

要在最前面import re,可以匹配出所有含有a的标签
③可以传入一个list列表

print(soup.find_all(['a','b']))

结果如下:

[<b>The demo python introduces several python courses.</b>, <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]

④可以传入一个函数
我还没实现。!!!!
attrs
attrs查找包含该属性的标签

print(soup.find_all('p','course'))

或者

print(soup.find_all('p',class_ = 'course'))

都能查找p标签里class为course的。

print(soup.find_all(id = 'link1'))

查找以link开头的id的标签:

print(soup.find_all(id = re.compile('^link')))

结果:

[<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>, <a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>]

recursive
是否对子孙全部检索,默认是True
查找的其他方法:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BeautifulSoup是一个Python库,用于从HTML或XML文件中提取数据。它提供了一种简单而灵活的方式来解析和遍历标记文档,并提供了许多有用的方法和属性来获取所需的信息。 在BeautifulSoup库的学习笔记中,介绍了BeautifulSoup库的简介和安装方法。它可以通过pip进行安装,并且有多种解析器可供选择。BeautifulSoup类有五种基本元素,包括Tag标签、Name名字、Attributes属性、NavigableString非属性字符串和Comment注释。它们可以用于遍历标签树的下行、上行和平行遍历。此外,BeautifulSoup几乎覆盖了HTML和XML中的所有内容,还包括一些特殊对象,例如文档的注释部分。 需要注意的是,BeautifulSoup对象本身不是真正的HTML或XML的tag,因此它没有name和attribute属性。但是,在某些情况下,查看它的.name属性是很方便的,因此BeautifulSoup对象包含了一个特殊属性.name,其值为"[document]"。另外,还有一些特殊对象,例如注释对象,可以通过使用BeautifulSoup库来处理。 综上所述,BeautifulSoup库提供了强大的解析和提取HTML或XML中数据的功能,适用于各种爬虫和数据提取任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [BeautifulSoup学习笔记一](https://blog.csdn.net/weixin_43978546/article/details/104858873)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [BeautifulSoup 学习笔记](https://blog.csdn.net/zhengjian0617/article/details/81142540)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值