Python Beautiful Soup教程-CSS选择器

系列文章目录

Beautiful Soup教程-简介及安装
Beautiful Soup教程-基本使用
Beautiful Soup教程-认识选择器
Beautiful Soup教程-节点选择器之选择元素的方法
Beautiful Soup教程-节点选择器之提取信息的方法
Beautiful Soup教程-节点选择器之嵌套选择的方法
Beautiful Soup教程-节点选择器之关联选择的方法
Beautiful Soup教程-方法选择器
Beautiful Soup教程-CSS选择器



前言

Beautiful Soup是Python的一个网页解析库,处理快捷; 支持多种解析器,功能强大。教程细致讲解Beautiful Soup的深入使用、节点选择器、CSS选择器、Beautiful Soup4的方法选择器等重要知识点,是学好爬虫的基础课程。


Beautiful Soup CSS选择器

学习目标

  1. 掌握Beautiful Soup的CSS选择器的基本使用
  2. 掌握Beautiful Soup的CSS选择器的高级使用

1. Beautiful Soup CSS选择器总览

在这里插入图片描述

1. 了解Beautiful Soup的CSS选择器

使用CSS选择器,只需要调用select()方法,并结合CSS选择器语法就可以定位元素的位置。

1.1 获取元素
  • 格式:soup.select()

    soup为Beautiful Soup4对象

    select()中书写CSS选择器语法

1.2 CSS选择器语法

本部分内容在前端部分将结果,这里不再详细赘述,我们一起来简单复习下

(1) id选择器

id选择器需要使用#来定位元素,例如:获取第一个ul节点#list-1

<div class="panel-body">
    <ul class="list" id="list-1">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
      <li class="element">]ay</li>
    </ul>

    <ul class="list list-small" id="list-2">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
    </ul>
</div>

(2) 类选择器

类选择器需要使用.来定位元素,例如:获取所有的ul.list‘«

<div class="panel-body">
    <ul class="list" id="list-1">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
      <li class="element">]ay</li>
    </ul>

    <ul class="list list-small" id="list-2">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
    </ul>
</div>

(3) 标签选择器

标签选择器需要使用标签来进行选择,例如:获取h4 h4

<div class="panel-heading">
     <h4>Hello</h4>
</div>

(4) 混合使用

获取第一个ul中的li节点,.panel-body #list-1 li

<div class="panel-body">
    <ul class="list" id="list-1">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
      <li class="element">]ay</li>
    </ul>

    <ul class="list list-small" id="list-2">
      <li class="element"> Foo</li>
      <li class="element">Bar</li>
    </ul>
</div>
1.2 示例
  1. 获取class="panel-heading"div
  2. 获取所有的li节点
  3. 获取第二个ulli节点
  4. 获取第二个ul节点
html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
            <li class="element">]ay</li>
        </ul>
        
        <ul class="list list-small" id="list-2">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''


from bs4 import BeautifulSoup

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

输出结果如下:

[<div class="panel-heading">
<h4>Hello</h4>
</div>]
[<li class="element"> Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>, <li class="element"> Foo</li>, <li class="element">Bar</li>]
[<li class="element"> Foo</li>, <li class="element">Bar</li>]
<class 'bs4.element.Tag'>

2. CSS选择器的高级用法

2.1 嵌套选择

这里所指的嵌套选择和我们之前所学的嵌套选择是一样。先选择一个节点,再获取这个节点下面的子节点。

html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
            <li class="element">]ay</li>
        </ul>
        
        <ul class="list list-small" id="list-2">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
  print(type(ul))
  print(ul.select('li'))

输出结果:

<class 'bs4.element.Tag'>
[<li class="element"> Foo</li>, <li class="element">Bar</li>, <li class="element">Jay</li>]
<class 'bs4.element.Tag'>
[<li class="element"> Foo</li>, <li class="element">Bar</li>]


2.2 获取属性

CSS选择器获取属性的方法和节点选择器获取属性的方法一样,使用attrs属性来获取。

from bs4 import BeautifulSoup

html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
            <li class="element">]ay</li>
        </ul>
        
        <ul class="list list-small" id="list-2">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''

soup = BeautifulSoup(html, 'lxml')

print(soup.select("#list-2 li"))

for li in soup.select("#list-2 li"):
    print(type(li))
    print(li.attrs)
    print(li.attrs['class'])

输出结果

[<li class="element"> Foo</li>, <li class="element">Bar</li>]
<class 'bs4.element.Tag'>
{'class': ['element']}
['element']
<class 'bs4.element.Tag'>
{'class': ['element']}
['element']


2.3 获取文本

CSS选择器获取文本的方法和节点选择器获取文本的方法一样,使用stringstrings属性来获取。

from bs4 import BeautifulSoup

html = '''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
            <li class="element">]ay</li>
        </ul>
        
        <ul class="list list-small" id="list-2">
            <li class="element"> Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''

soup = BeautifulSoup(html, 'lxml')

print(soup.select("#list-2 li"))

for li in soup.select("#list-2 li"):
    print(type(li))
    print(li.string)

    
print(soup.select("#list-2"))

for ul in soup.select("#list-2"):
    print(type(ul))
    print(ul.strings)
    print(list(ul.strings))

输出结果

[<li class="element"> Foo</li>, <li class="element">Bar</li>]
<class 'bs4.element.Tag'>
 Foo
<class 'bs4.element.Tag'>
Bar

[<ul class="list list-small" id="list-2">
<li class="element"> Foo</li>
<li class="element">Bar</li>
</ul>]
<class 'bs4.element.Tag'>
<generator object _all_strings at 0x101c353b8>
['\n', ' Foo', '\n', 'Bar', '\n']

3. 总结

  1. 嵌套选择,之所以能够进行嵌套选择是因为它依然是一个Tag对象
  2. 获取属性,和节点选择器一样,使用attrs属性来获取属性值
  3. 获取文本,和节点选择器一样,使用stringstrings属性来获取文本信息

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值