跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手

一 前言

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库;其强大的提取能力让知识追寻者放弃了使用正则匹配查找HTML节点;Beautifu Soup 其能直接通过HTML标签获取相应的节点,或者通过函数直接获得节点,大大提高了编程人员的开发效率;看完本篇学不会Beautiful Soup ,满天神佛都救不了你;觉得知识追寻者的文章有点意思,关注加点赞谢谢;

二 Beautiful Soup 简单使用

Beautiful Soup 的解释器如下:

解释器 使用示例
Python标准库 BeautifulSoup(markup, "html.parser")
lxml HTML 解析器 BeautifulSoup(markup, "lxml")
lxml XML 解析器 BeautifulSoup(markup, "xml")
html5lib BeautifulSoup(markup, "html5lib")

本篇的解释器读者可以使用Python标准库或者lxml HTML 解析器都可以;下午中获取标签其实都是获取标签对象,读者谨记;

简要概括下属性的说明:

属性 含义
soup.tag.name 获取标签tag名称
soup.tag.string 获取标签tag文本内容
soup.tag 获取标签tag
soup.tag.attrs 获取标签tag所有属性
soup.tag.attrs[‘class‘] 获取标签指定class的属性
soup.tag1.tag2 获取子标签tag2
soup.tag.contents 获取tag所有直接子标签以列表输出
soup.tag.children 获取直接子标签,返回生成器
soup.tag.descendants 获取所有子标签,返回生成器
soup.tag.parent 获取直接父节点
soup.tag.parents 获取祖先节点,返回生成器
soup.tag.next_sibling 获取后一个兄弟节点
soup.tag.previous_sibling 获取前一个兄弟节点
soup.tag.next_siblings 获取后一个兄弟节点,返回生成器
soup.tag.previous_siblings 获取前一个兄弟节点,返回生成器

2.1 格式化HTML

  1. 实例化一个Beautiful Soup 实例,入参是HTML,和html.parser
  2. 调用prettify()方法会格式化HTML文档
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.prettify())

输出结果下,是不是很美观,结构是不是很清楚;而且还补全了缺失的标签</form> , </div>

<div class="filter-box d-flex align-items-center">
 <form action="" id="seeOriginal">
  <dl class="filter-sort-box d-flex align-items-center">
   <dt>
    排序:
   </dt>
   <dd>
    <a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">
     默认
    </a>
   </dd>
   <dd>
    <a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
     <svg aria-hidden="true" class="icon">
      <use xlink:href="#csdnc-rss">
      </use>
     </svg>
     RSS订阅
    </a>
   </dd>
  </dl>
 </form>
</div>

2.2 获取标签节点

  1. 调用soup.dt 会直接获得第一个匹配到dt标签对象;
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
# 输出节点 <dt>排序:</dt>
print(soup.dt)

2.3 获取节点文本

soup.dt.string 获得dt标签包含的内容;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
# 输出文本内容 排序:
print(soup.dt.string)

2.4获取节点名称

soup.dt.name 直接获得标签dt的名称;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
# 输出dt
print(soup.dt.name)

2.5 获得节点对象种类

直接获得标签后使用type方法可以显示出标签类型是<class ‘bs4.element.Tag‘>

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
dt = soup.dt
# <class 'bs4.element.Tag'>
print(type(dt))

2.6 获取所有属性

soup.a.attrs 获取匹配到第一个a标签的所有属性;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.a.attrs)

输出默认匹配第一个a标签的全部属性

{'href': 'javascript:void(0);', 'data-report-query': '', 'class': ['btn-filter-sort', 'active'], 'target': '_self'}

2.7 获取特定属性

soup.a.attrs[‘href‘],获取匹配到第一个a标签的href属性内容

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
# 输出javascript:void(0);
print(soup.a.attrs['href'])

2.8 获取子节点

soup.form.dd 会获得form标签下第一个dd标签

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.form.dd)

输出

<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>

2.9 获取所有直接子节点

soup.form.contents 将会以列表的形式输出form所有的子标签;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.form.contents)

输出结果:

['\n', <dl class="filter-sort-box d-flex align-items-center">
<dt>排序:</dt>
<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>
<dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>
</dl>]

2.10 获取直接子节点生成器

soup.svg.children 会获得dd所有子节点的生成器;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
for index, child in enumerate(soup.svg.children):
    print(index, child)

输出结果:

0 

1 <use xlink:href="#csdnc-rss"></use>
2 

2.11 获取所有子节点生成器

soup.dl.descendants 会获取dl 标签所有的子节点(more than direct child node),

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
for index, child in enumerate(soup.dl.descendants):
    print(index, child)

输出结果:

0 

1 <dt>排序:</dt>
2 排序:
3 

4 <dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>
5 <a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a>
6 默认
7 

8 <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>
9 <a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
10 

11 <svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>
12 

13 <use xlink:href="#csdnc-rss"></use>
14 

15 RSS订阅
16 

17

2.12 获取直接父节点

soup.a.parent 或获取第一个匹配到a标签的父标签对象;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.a.parent)

输出结果:

<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>

2.13 获取祖先节点生成器

soup.a.parents 会获得第一个匹配到a标签的所有父节点,也就是祖先节点,返回生成器;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
for node in soup.a.parents:
    if node is None:
        print(node)
    else:
        print(node.name)

输出结果:

dd
dl
form
div
[document]

2.14 获取兄弟节点

兄弟节点有个坑,通常是返回空白,就不做过多讲解

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.dt.next_sibling)

输出是空白;其它兄弟节点属性就不写了,感觉没啥意义,不是空白就是None;

三 搜索文档

学完第二节内容,读者们其实就是打了个基础,重点是这章节;

函数 含义
find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs) 查找所有匹配节点
find(name=None, attrs={}, recursive=True, text=None, **kwargs) 查找第一个匹配节点
find_parent(name=None, attrs={}, **kwargs) 返回当前节点的父辈节
find_parents(name=None, attrs={}, **kwargs) 返回当前节点的祖先节点
find_next_sibling(name=None, attrs={}, text=None, **kwargs) 返回符合条件的后面的第一个tag节点
find_next_siblings(name=None, attrs={}, text=None, **kwargs) 返回所有符合条件的后面的兄弟节点
find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs) 返回第一个符合条件的前面的兄弟节点
find_previous_siblings(self, name=None, attrs={}, text=None, **kwargs) 返回所有符合条件的前面的兄弟节点
find_next(name=None, attrs={}, text=None, **kwargs) 返回第一个符合条件的节点
find_all_next(name=None, attrs={}, text=None, limit=None, **kwargs) 返回所有符合条件的节点
find_previous(name=None, attrs={}, text=None, **kwargs) 返回第一个符合条件的节点
find_all_previousname=None, attrs={}, text=None, limit=None, **kwargs) 返回所有符合条件的节点
  1. name 表示输出的tag名称
  2. attrs 表示指定属性查找
  3. recursive 表示是否递归所有子节点,默认是;设置为false返回直接子节点
  4. limit 表示 限制 输出数量
  5. **kwargs 可以指定经常出现的属性搜索,比如 id = ‘zszxz‘
  6. text 是过滤条件

本节着重讲解find_all方法,find方法于find_all一致,学一个就会用另一个;

3.1 name参数示例

soup.find_all(name=‘dd‘) 会获得所有dd标签对象,并且返回列表;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all(name='dd'))

输出结果

[<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>, <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>]

注:soup.find_all(name=‘dd‘) 与 soup.find_all(‘dd‘) 一致;

3.2 attrs 属性示例

soup.find_all(attrs={‘id‘:‘seeOriginal‘}) 获取 属性 id = seeOriginal 所有标签对象

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all(attrs={'id':'seeOriginal'}))

输出

[<form action="" id="seeOriginal">
<dl class="filter-sort-box d-flex align-items-center">
<dt>排序:</dt>
<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>
<dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>
</dl></form>]

3.3 recursive 示例

soup.find_all(‘dl‘,recursive=False) 会查找dl标签子节点,当recursive 设置为False之后就找不到了;

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all('dl',recursive=False))

输出空列表[]

3.4limit示例

soup.find_all(‘dd‘,limit=1)会限制输出结果为一条

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all('dd',limit=1))

输出

[<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>]

3.5 kwargs 示例之属性匹配

soup.find_all(id=‘seeOriginal‘)直接指定id属性查找

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all(id='seeOriginal'))

输出

[<form action="" id="seeOriginal">
<dl class="filter-sort-box d-flex align-items-center">
<dt>排序:</dt>
<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>
<dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>
</dl></form>]

3.6 kwargs 示例之正则匹配

soup.find_all(href=re.compile("java.*?"))匹配属性 href 正则 java开头的属性标签;

# -*- coding: utf-8 -*-
import re

import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all(href=re.compile("java.*?")))

输出结果

[<a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a>]

3.7 按CSS搜索

soup.find_all("a", class_="btn") 查找a标签,class属性带有btn

# -*- coding: utf-8 -*-
import re

import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
print(soup.find_all("a", class_="btn"))

输出结果

[<a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>]

四CSS选择器

Beautiful Soup 还直接支持CSS选择器搜索,下面列出了经常使用的方法示例;

# -*- coding: utf-8 -*-
import re

import requests
from bs4 import BeautifulSoup

html = """
    <div class="filter-box d-flex align-items-center">
    <form action="" id=seeOriginal>
    <dl class="filter-sort-box d-flex align-items-center">
    <dt>排序:</dt>
    <dd><a href="javascript:void(0);" data-report-query="" class="btn-filter-sort active" target="_self">默认</a></dd>
    <dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
        <svg class="icon" aria-hidden="true">
            <use xlink:href="#csdnc-rss"></use>
        </svg>RSS订阅</a>
    </dd>
  </dl>"""

# 初始化 soup
soup = BeautifulSoup(html,'html.parser')
# 选取 dl 标签下面的 dt标签
lt = soup.select('dl dt')
print(lt)
dd = soup.select('dl dd')
print(dd[0])
# id 选择器搜索
id = soup.select('#seeOriginal')
print(id)
# class选择器 搜索
cla = soup.select('.btn-filter-sort')
print(cla[0])

分别输出如下

soup.select(‘dl dt‘)

[<dt>排序:</dt>]

soup.select(‘dl dd‘)[0]

<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>

soup.select(‘#seeOriginal‘)

[<form action="" id="seeOriginal">
<dl class="filter-sort-box d-flex align-items-center">
<dt>排序:</dt>
<dd><a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a></dd>
<dd><a class="btn btn-sm rss" href="https://blog.csdn.net/youku1327/rss/list">
<svg aria-hidden="true" class="icon">
<use xlink:href="#csdnc-rss"></use>
</svg>RSS订阅</a>
</dd>
</dl></form>]

soup.select(‘.btn-filter-sort‘)[0]

<a class="btn-filter-sort active" data-report-query="" href="javascript:void(0);" target="_self">默认</a>

原文地址:https://www.cnblogs.com/zszxz/p/12208673.html

时间: 2024-10-22 00:31:32

跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手的相关文章

知识追寻者网址神器私藏合集

一 前言 考虑到知识追寻者的很多粉丝不知道如何获取学习资源进行,知识追寻者特地在此罗列出经常使用的网站:以供读者们查找工具集进行有效的学习:俗话说的好,授人以鱼不如授人以渔:知识追寻者在2018年底开始自学java的时候有看过java基础视频教程:后来觉得太浪费时间了,就再也没碰过,所以这边就不再献丑推荐视频网址了:知识追寻者在这边推荐得不仅得学习网址不仅适用于java,python领域,只要是计算机领域都适合: 二 计算机书籍网址 2.1 java知识分享网 java知识分享网 主要分享的是计

新学期跟着大伟老师学下软件工程!!!

新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!新学期跟着大伟老师学下软件工程!!!

python专题知识追寻者对OS的理解

一 前言 OS(operating system)直接对操作系统进行操作的接口,功能真是非常强大:允许知识追寻者简要概括一下整体模块 如果要对文件进行读写可以使用os.open()方法 如果要对文件路径进行操作可以使用os.path模块 如果要对所有文件的所有行读取到命令行进行操作可以使用fileinput模块 如果要创建临时文件可以使用tempfile模块 如果要对高级文件或者目录进行处理可以使用shutil模块 知识的体系很重要,比如很多书籍文章只知如何使用OS对路径进行操作,但整体的OS是

软件测试为什么需要学习Linux的知识?Linux学到什么程度?-log5

软件测试为什么需要学习Linux的知识?学到什么程度?-log5 ---Dotest软件测试测试学堂-董浩--- 公司目前90%的服务器操作系统不是windows,而是linux(redhat.debin.centos):因此如果你想要定位一个问题或者迭代环境更新时,你就需要登录后台服务器去排查.操作.这时候你不会linux,怎么可以? 另外就算你在公司内用不到(因为后台服务器可能会限制),你会发现现在2019招聘软件测试,大部分都需要测试环境搭建.linux命令基础.shell脚本能力. 因此

跟着阿里p7一起学java高并发 - 第18天:玩转java线程池,这一篇就够了

java中的线程池,这一篇就够了 java高并发系列第18篇文章. 本文主要内容 什么是线程池 线程池实现原理 线程池中常见的各种队列 自定义线程创建的工厂 常见的饱和策略 自定义饱和策略 线程池中两种关闭方法有何不同 扩展线程池 合理地配置线程池 线程池中线程数量的配置 什么是线程池 大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁.数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的.每个数据库操作之前都需要创

跟着锁薇姐姐学的爬取返利网h1标签信息~

# _*_ coding:UTF-8 _*_ import urllib.requestimport urllib.errorimport refrom bs4 import BeautifulSoupimport timeimport socket #获取主页的源码fanly_url = "http://zhide.fanli.com/p" #多页format_url = "http://zhide.fanli.com/detail/1-" #商品链接 class

canvas知识03:学写一个字案例

效果      一.知识点 屏幕坐标系与canvas坐标系的转换: canvas中API的使用:路径状态保存.线的绘制及设置.虚线的使用: 根据速度(v=s/t)动态计算线宽及路程的计算方式: JS鼠标事件和触屏事件: 屏幕自适应的应用. 二.HTML代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="

跟着PHP100第一季学写一个CMS

笔记: cms0.11.问题:分两个css来实现时basic.css+index.php出现定位不正确问题     解决:@CHARSET "UTF-8"; 第一行说明漏了一个封号“;”导致奇怪问题,花了半个多小时和原文件对比.     ps.经常会犯这种错误少个结尾符号,浪费大量时间.

跟着小程来学微服务--微服务思想

前言 一直对微服务非常感兴趣,因为公司的架构改造正好有机会能够接触微服务,买来一些书,请教了很多微服务大牛同时自己也做了很多总结,写成了80页ppt,算是我对微服务的一个认识吧,微服务本身不同的人有不同的理解,而我就从我自己的角度来谈谈微服务是什么. 目前市面上的不少书或者不少相关文章写的都是框架的使用,或者架构的介绍,其实对于刚入门不久的同学来说很容易造成微服务就是一堆框架和组件的堆砌,于是今天我将从理论和实践的角度来说说微服务. 现代互联网的方向是当企业发展到一定规模后,一定是大规模.云计算