BeautifulSoup

  前面的正则表达式很繁琐,我们每一个地方都要写标签,多了的话我们就会很糊涂,而BeautifulSoup是一个灵活又方便的网页解析库,处理高效,支持多种解析器,利用它不用编写正则表达式即可方便的对网页信息进行提取
安装

pip3 installl beautifulsoup4

用法详解

  解析库:
HOKv.png

  • 基本使用
      BeautifulSoup有很多方法,现在先介绍两个,一个是可以把代码格式化,比如那些很乱的代码,可以给我们格式化,还有就是可以提取出title里面的信息,先感受一下
# -*- coding: UTF-8 -*-
html = '''<html class="no-js bg cool-transparent" lang="zh-cmn-Hans">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <meta charset="UTF-8">
    <!--IE 8浏览器的页面渲染方式-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <!--默认使用极速内核:针对国内浏览器产商-->
    <meta name="renderer" content="webkit">
    <!--chrome Android 地址栏颜色-->
        <meta name="theme-color" content="#3a3f51" />
    
    <meta http-equiv="x-dns-prefetch-control" content="on">

    <title>芥子博客 - 片刻组成永恒啊</title><li><a href="https://yuanpeng666.top/index.php/category/linux/"><b class="badge pull-right">16</b><span>Linux</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/python/"><b class="badge pull-right">16</b><span>python</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e7%25bd%2591%25e7%25bb%259c/"><b class="badge pull-right">68</b><span>网络</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/java/"><b class="badge pull-right">5</b><span>java</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e8%2599%259a%25e6%258b%259f%25e6%259c%25ba/"><b class="badge pull-right">4</b><span>虚拟机</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/macos/"><b class="badge pull-right">5</b><span>macos</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e5%25bb%25ba%25e7%25ab%2599/"><b class="badge pull-right">13</b><span>建站</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e7%25a0%25b4%25e8%25a7%25a3/"><b class="badge pull-right">8</b><span>破解</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/photoshop/"><b class="badge pull-right">2</b><span>Photoshop</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/sql/"><b class="badge pull-right">5</b><span>SQL</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/nginx/"><b class="badge pull-right">15</b><span>nginx</span></a></li>                </ul>'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)

  可以看一下打印结果:
HdUe.png
  已经将前面的body补全了,title也已经打印出来了。

标签选择器

  • 选择元素
      先看下面这段代码,我们提取里面的内容来看看,选择性的提取这些标签:
# -*- coding: UTF-8 -*-
html = '''<html class="no-js bg cool-transparent" lang="zh-cmn-Hans">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <meta charset="UTF-8">
    <!--IE 8浏览器的页面渲染方式-->
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <!--默认使用极速内核:针对国内浏览器产商-->
    <meta name="renderer" content="webkit">
    <!--chrome Android 地址栏颜色-->
        <meta name="theme-color" content="#3a3f51" />
    
    <meta http-equiv="x-dns-prefetch-control" content="on">

    <title>芥子博客 - 片刻组成永恒啊</title><li><a href="https://yuanpeng666.top/index.php/category/linux/"><b class="badge pull-right">16</b><span>Linux</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/python/"><b class="badge pull-right">16</b><span>python</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e7%25bd%2591%25e7%25bb%259c/"><b class="badge pull-right">68</b><span>网络</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/java/"><b class="badge pull-right">5</b><span>java</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e8%2599%259a%25e6%258b%259f%25e6%259c%25ba/"><b class="badge pull-right">4</b><span>虚拟机</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/macos/"><b class="badge pull-right">5</b><span>macos</span></a></li><p class="summary l-h-2x text-muted">requests库的基本和高级使用方法</p><li><a href="https://yuanpeng666.top/index.php/category/%25e5%25bb%25ba%25e7%25ab%2599/"><b class="badge pull-right">13</b><span>建站</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/%25e7%25a0%25b4%25e8%25a7%25a3/"><b class="badge pull-right">8</b><span>破解</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/photoshop/"><b class="badge pull-right">2</b><span>Photoshop</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/sql/"><b class="badge pull-right">5</b><span>SQL</span></a></li><li><a href="https://yuanpeng666.top/index.php/category/nginx/"><b class="badge pull-right">15</b><span>nginx</span></a></li>                </ul>
'''
'''from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.head)
print(soup.p)

  我们从网站上获取了一些代码,然后打印了title和head还有p标签,以及title的类型,我们看看结果:
HtxY.png
  可以看到把title标签完整的打印出来了,还有title的类型,是Tag,还有head,看似都很正常,但是我们发现p标签啊只打印了一个。这个可以理解为其一个属性,如果有多个只打印第一个出来。

  • 获取名称
      还是上面的代码和内容,我们打印下面这样:
print(soup.title.name)

  这样就会打印出标签的名称,如图所示:
H2TM.png

  • 获取属性
      现在看看如何获取到标签里面独有的属性,代码如下:
# -*- coding: UTF-8 -*-
html = '''
    <p name="666">下午好,是时候打个盹了</p>
    <p>下午好,是时候打个盹了</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.p.attrs['name'])
print(soup.p['name'])

  上面我们获取了p标签里面的name属性,我们可以看看打印结果:
HXpU.png
  可以看到这两中方法都是可以的,也不一定非要加attrs,不过特性还是那个特性,如果还有一个p标签里面恰好也还有name那么获取到的还是第一个。

  • 获取内容
      基本上就剩下内容没有获取了,我们现在看看下面这段代码,看看是如何获取内容的:
# -*- coding: UTF-8 -*-
html = '''
    <p name="666">下午好,是时候打个盹了</p>
    <p name="88">晚上好,是时候打个盹了</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.p.string)

  还是把获取到的p标签格式化成string类型,就会出现打印结果,还是只出现一个:
HMPz.png

  • 嵌套选择
      现在再看一种方法,就是我们可以在head里面选择title打印出来,具体代码如下:
# -*- coding: UTF-8 -*-
html = '''
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <title>芥子博客 - 片刻组成永恒啊</title>
</head>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.head.title.string)

  看代码就知道是head里面的title然后转成string,我们看看打印结果,这样就是层层嵌套。
HQYt.png

  • 子节点和子孙节点
      我们知道在html里面有很多的标签,都是层层包含着的,比如一个div里面有多个span等等,我们看看下面的这段代码:
# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <span class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </span>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.a.contents)

  我们可以看到这个a标签里面有一个第一和第二,这两个字是我后期打进去的,这两个字明显在同级下,然后我们用contents方法把其提取出来看看结果:
HNUC.png
  我们现在仔细分析一下结果,首先它是一个list类型的数据,然后我们看到第一后面有一个n这个就是换行符,最后的第二后面也有个换行符,那么这个就是把a标签里面的所以内容都匹配出来了,然后把a标签里面的内容打印出来了。再来看看另一种方法:

# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">
第一
                <span class="clear">
                  <span class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </span>
                <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
第二
</a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.a.children)
for i, child in enumerate(soup.a.children):
    print(i, child)

  看看输出结果:
Hl23.png
  我们这个方法就是用了迭代器的,看到前面的第一的前面有个“0”,然后在<span>这段前面有个“1”,然后在第二前面有个“2”,这个就是用了迭代器的,一级一级,然后换行符什么的都是打印出来了,不过不再是刚才的list类型了,最后一个是获取所有的子孙节点:

# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <span class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </span>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.a.descendants)
for i, child in enumerate(soup.a.descendants):
    print(i, child)

  代码还是刚才那些,但是我们这次用的是descendants这个方法,我们看看答应结果:
HqAB.png
  这里的结果很明显,就是把每一个子孙关系的都用迭代的方式打印出来了。包括自身的这个a标签。
  稍微总结一下,这里第一个contents是获取子节点,返回类型是列表。 第二个children获取的也是子节点,不过返回的是一个迭代器。第三个descendants获取的就是所有的子孙节点,同样也是一个迭代器。

  • 父节点和祖先节点
      既然都获取了子节点和子孙节点了,当然也会有父节点和祖先节点的。
# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <span class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </span>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.b.parent)

  我们这里获取一下b标签的父节点:
H1kW.png
  我们再看看下面这样写,可以获取到所有的父节点和祖先节点:

# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <span class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </span>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(list(enumerate(soup.b.parents)))

  可以看到能够获取到所有的父节点以及祖先节点:
Heng.png
  我们是把其转化成了list然后用的是parents。看到后面连a标签和html都输出了,截图不全,建议自行实验

  • 兄弟节点
      最后一个就是兄弟节点,说白了就是其同级目录的节点,我们直接看看下面的代码:
# -*- coding: UTF-8 -*-
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(list(enumerate(soup.p.next_siblings)))

  这次用的是next_siblings,就是获取它前面的兄弟节点,结果如下图:
HxgO.png
  如果打印下面代码中的结果那么意思就是说获取兄弟节点后面的内容:

print(list(enumerate(soup.p.previous_siblings)))

标准选择器

  find_all
  可根据标签名,属性,内容,查找文档

  • name
      现在先看看这个name是干什么用的
html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret"></b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.find_all(name='p'))
print(type(soup.find_all('p')[0]))

  这里name选择p就是会打印出所有的p标签里面的内容,然后是一个列表的形式,而且最后我们打印出来的类型是.Tag的,意味着这样就可以跟上节说的那样可以层层嵌套。打印结果如图:
HgTT.png
  下面举一个层层嵌套的例子:

html = '''
<a href="#" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">888</b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">655</b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
for p in soup.find_all(name='p'):
    print(p.find_all(name='b'))

  上面这个就是在p标签里面查找b标签,并将其内容打印出来,注意这里用了for循环查找的,我们看看打印结果:
How1.png

  • attrs
      通过一些特定的属性名字来查找。直接看看代码:
html = '''
<a href="66" data-toggle="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">888</b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">66</strong>
                    <b class="caret">655</b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'class':'font-bold text-lt'}))
print(soup.find_all(attrs={'href':'66'}))

  看上面的第一次打印结果,我们知道是在找class=font-bold text-lt的标签,源码中只有两段。第二个打印结果是找href=66的标签里面所有内容,那就是把全文打印出来了:
Hrlp.png
  可以看见打印结果和我们预测的一样,这个方法很不错在一些特定的标签内容中找到想要的东西很简单。还有一种方法就是直接查找:

html = '''
<a href="66" data="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">888</b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">66</strong>
                    <b class="caret">655</b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
'''from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.find_all(name='p'))
print(type(soup.find_all('p')[0]))'''
'''from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
for p in soup.find_all(name='p'):
    print(p.find_all(name='b'))
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(class_='font-bold'))
print(soup.find_all(data='dropdown'))

  这种方法比刚才的要简单很多直接找class或者其他属性,特别需要注意的是这里的class比较特殊,要在后面加一个下划线,否则不会识别到。

  • text
      再来看一下这个text方法,这个就是查找内容的,用在文本匹配的比较多,标签查找就比较少了,我们看看代码怎么写:
html = '''
<a href="66" data="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">888</b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">655</b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text='圆圆'))

  这里查找了有“圆圆”的内容,我们看看打印结果:
H3Y9.png
  看到这里只是把结果打印出来了,并没有把标签打印出来,所以这个在用于查找内容的时候用的比较多。
  find
  还有一个find方法这个就是跟刚才的find_all是一样的,不过find_all是查找所有的内容并打印成列表的形式,而find是打印一个值出来。

html = '''
<a href="66" data="dropdown" class="dropdown-toggle hidden-folded  vertical-flex">第一
                <span class="clear">
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">888</b>
                  </p>
                  <p class="block m-t-sm">
                    <strong class="font-bold text-lt">圆圆</strong>
                    <b class="caret">655</b>
                  </p>
                  <span class="text-muted text-xs block">一个不懂浪漫的宅男</span>
                </span>
                第二
              </a>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
#print(soup.find_all(text='圆圆'))
print(soup.find(text='圆圆'))

  就拿刚才的例子来说,打印除了两个结果且是列表的形式,而这次的这个find就只打印了一个结果。
H6ZN.png
  而且这个find也是支持嵌套的,如果你查找了一个不存在的标签那么返回结果就是None。

其他的用法

  find_parents() find_parent()
  find_parents()返回所有祖先节点,find_parent()返回直接父节点。
  find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。
  find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点
  find_all_next()返回节点后所有符合条件的节点,find_next()返回第一个符合条件的节点
  find_all_previous()返回节点后所有符合条件的节点,find_previous返回第一个符合条件的节点

CSS选择器

  通过select()直接传入CSS选择其即可完成选择

html = '''
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
    <b>The Dormouse's story</b>
    Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">
        <span>Elsie</span>
    </a>
    <a href="http://example.com/lacie" class="sister" id="link2">
    <span>Elsieq</span>Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    <div class='panel-1'>
        <ul class='list' id='list-1'>
            <li class='element'>Foo</li>
            <li class='element'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
        <ul class='list list-small' id='list-2'>
            <li class='element'><h1 class='yyyy'>Foo</h1></li>
            <li class='element xxx'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
    </div>
    and they lived at the bottom of a well.
</p>
<p class="story">...</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
print(soup.select('.title .sister'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

  上面第一个打印的结果是选择了class=title和class=sister,因为class比较特殊所以前面要加一个点,而且两个class之间要用空格隔开,第二个打印结果是在ul标签里面找li标签,并打印出来,第三个就是在找id=list-2的标签打印出来,把id写成了#号键,第四个就是打印了类型结果是Tag可以嵌套的类型:
HSF7.png

html = '''
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
    <b>The Dormouse's story</b>
    Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">
        <span>Elsie</span>
    </a>
    <a href="http://example.com/lacie" class="sister" id="link2">
    <span>Elsieq</span>Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    <div class='panel-1'>
        <ul class='list' id='list-1'>
            <li class='element'>Foo</li>
            <li class='element'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
        <ul class='list list-small' id='list-2'>
            <li class='element'><h1 class='yyyy'>Foo</h1></li>
            <li class='element xxx'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
    </div>
    and they lived at the bottom of a well.
</p>
<p class="story">...</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for ul in soup.select('ul'):
    print(ul.select('li')
    )

  上面这个方法也是一样的,在ul里面去找到li标签,然后打印出来。

  • 获取属性
      我们再来看看最后怎么获取属性和内容。获取属性很简单直接用中括号就能获取到了。
html = '''
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
    <b>The Dormouse's story</b>
    Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">
        <span>Elsie</span>
    </a>
    <a href="http://example.com/lacie" class="sister" id="link2">
    <span>Elsieq</span>Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    <div class='panel-1'>
        <ul class='list' id='list-1'>
            <li class='element'>Foo</li>
            <li class='element'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
        <ul class='list list-small' id='list-2'>
            <li class='element'><h1 class='yyyy'>Foo</h1></li>
            <li class='element xxx'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
    </div>
    and they lived at the bottom of a well.
</p>
<p class="story">...</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

  这样就是获取了ul里面的id属性。然后打印出来:
HzA5.png

  • 获取内容
      然后再看看怎么获取内容。
html = '''
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
    <b>The Dormouse's story</b>
    Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">
        <span>Elsie</span>
    </a>
    <a href="http://example.com/lacie" class="sister" id="link2">
    <span>Elsieq</span>Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    <div class='panel-1'>
        <ul class='list' id='list-1'>
            <li class='element'>Foo</li>
            <li class='element'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
        <ul class='list list-small' id='list-2'>
            <li class='element'><h1 class='yyyy'>Foo</h1></li>
            <li class='element xxx'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
    </div>
    and they lived at the bottom of a well.
</p>
<p class="story">...</p>
'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

for li in soup.select('li'):
    print(li.get_text())

  这里有个get_text的属性可以直接获取到内容,这个是很方便的。获取标签里面的内容

总结

1、推荐使用lxml解析库,必要时使用html。parser
2、标签选择筛选功能弱但是速度快
3、建议使用find()、find_all()、查询匹配单个结果或多个结果
4、如果对CSS选择器熟悉建议使用select()
5、记住常用的获取属性和文本值的方法

最后修改:2020 年 05 月 05 日 01 : 44 PM
请俺喝杯咖啡呗