系列文章目录
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选择器
学习目标
- 掌握Beautiful Soup的CSS选择器的基本使用
- 掌握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 示例
- 获取
class="panel-heading"
的div
- 获取所有的
li
节点 - 获取第二个
ul
的li
节点 - 获取第二个
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选择器获取文本的方法和节点选择器获取文本的方法一样,使用string
和strings
属性来获取。
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. 总结
- 嵌套选择,之所以能够进行嵌套选择是因为它依然是一个Tag对象
- 获取属性,和节点选择器一样,使用
attrs
属性来获取属性值 - 获取文本,和节点选择器一样,使用
string
和strings
属性来获取文本信息