BeautifulSoup库的使用

时间:2025-02-11 16:06:57

目录

      • 前言
      • 根据标签和属性识别
      • 根据标签内内容来识别
      • 提取内容
      • 查看标签信息
      • 多层嵌套标签
      • BeautifulSoup示例:
      • CSS选择器的示例:
      • 其他:

前言

BeautifulSoup库是python中常用的的网页解析库,灵活,高效,支持多种解析器。可以很方便地实现网页信息的提取。

根据标签和属性识别

# 获取id=d1的div标签
soup.find('div', id = 'd1')

# 获取class=d1的所有div标签
soup.find_all('div', class_ = 'd1')

# 最通用的方法
soup.find_all('p', attrs={'class':'p3'}) # 包含这个属性就算,而不是只有这个属性
soup.find_all('p', attrs={'class':'p3','id':'pp'}) # 使用多个属性匹配
soup.find_all('p', attrs={'class':'p3','id':False}) # 指定不能有某个属性
soup.find_all('p', attrs={'id':['p1','p2']}) # 属性值是p1或p2

# 正则表达式匹配
import re
soup.find_all('p', attrs={'id':re.compile('^p')}) # 使用正则表达式
soup.find_all('p', attrs={'class':True}) # 含有class属性即可

根据标签内内容来识别

a = '''
<p id='p1'>段落1</p>
<p class='p3'>段落2</p>
<p class='p3'>文章</p>
<p></p>
'''

soup = BeautifulSoup(a, "")

soup.find_all('p', text='文章')
soup.find_all('p', text=['段落1','段落2'])

# 正则表达式
import re
soup.find_all('p', text=re.compile('段落'))
soup.find_all('p',text=True)

# 传入函数
def nothing(c):
    return c not in ['段落1','段落2','文章']
soup.find_all('p',text=nothing)

# 同上
def nothing(c):  
    return c is None
soup.find_all('p',text=nothing)

提取内容

  1. 提取标签内容:使用.text
  2. 提取标签属性值,像字典一样提取
a = '''
<body>
    <h><a href=''>标题</a></h>
    <p>段落1</p>
    <p>段落2</p>
</body>
'''
soup = BeautifulSoup(a, '')

# 提取内容
soup.p.text
for p in soup.find_all('p'):
    print(p.text)
soup.h.text # 多层嵌套也可以直接返回
soup.h.a.text # 也可以这样
soup.body.text # 里面有多个内容时 '\n标题\n段落1\n段落2\n'

# 提取属性值,像字典一样提取,以下两种方法等价
soup.h.a['href']
soup.h.a.get('href')

查看标签信息

  1. 获得标签名
  2. 获得标签所有属性的字典
  3. 检查标签是否有某属性
a = '''
<body>
    <h><a href=''>标题</a></h>
    <p>段落1</p>
    <p></p>
</body>
'''
soup = BeautifulSoup(a, '')
for i in soup.body.find_all(True):
    print(i.name) # 提取标签名
    print(i.attrs) # 提取标签所有属性值
    print(i.has_attr('href')) # 检查标签是否有某属性

多层嵌套标签

a = '''
<span>
    <span id='s'>内容1</span>
</span>
<span>内容2</span>
'''
soup = BeautifulSoup(a, '')

# 多层嵌套标签
soup.find_all('span')

# find_all的其他参数
soup.find_all('span', limit=2) # 限制只返回前两个
soup.find_all('span', recursive=False) # 只查找子节点,不查找孙节点

BeautifulSoup示例:

from bs4 import BeautifulSoup
import requests

url = ""
r = requests.get(url)

# 解析HTML内容
soup = BeautifulSoup(r.content, '')

# 查找页面中的所有的a标签,并打印出连接地址
links = soup.find_all('a')
for link in links:
    print(link.get('href'))

这个示例演示了如何使用BeautifulSoup从一个网站上提取所有链接。首先,使用Python库requests向该网站发出请求,然后使用BeautifulSoup解析HTML内容。最后,使用find_all()方法查找HTML中的所有链接,并打印它们的href属性。

BeautifulSoup还提供了许多其他方法,包括find()和find_all(),这些方法可以通过标签、类、ID等来搜索HTML内容。另外,BeautifulSoup还支持CSS选择器,可以使用select()方法来使用CSS选择器查找HTML内容。

CSS选择器的示例:

from bs4 import BeautifulSoup
import requests

url = ""
r = requests.get(url)

soup = BeautifulSoup(r.content, '')

links = soup.select('')
for link in links:
    print(link.get('href'))

这个示例演示了如何使用CSS选择器查找所有class为"link"的链接。在select()方法中,我们使用CSS选择器""来查找所有带有class="link"的标签。

其他:

BeautifulSoup(a, "")这里的第二个参数表示使用的解析器,BeautifulSoup提供了三个解析器,它们各自的优缺点如下

内置不依赖扩展,容错能力强,速度适中
lxml速度最快,容错能力强,但是依赖C扩展
html5hib速度最慢,容错能力最强,依赖扩展


  • ????博客主页:/qq233325332
  • ????欢迎点赞 ???? 收藏 ⭐留言 ???? 如有错误敬请指正!
  • ????本文由 陌北v1 原创,首发于 ****博客????
  • ????停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨