爬虫Beautiful Soup的CSS选择器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/86409868

一 点睛

Beautiful Soup还提供了另外一种选择器,那就是CSS选择器。如果对Web开发熟悉的话,那么对CSS选择器肯定也不陌生。如果不熟悉的话,可以参考http://www.w3school.com.cn/cssref/css_selectors.asp了解。

使用CSS选择器时,只需要调用select()方法,传入相应的CSS选择器即可。

二 基础用法

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">Jay</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]))

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
[<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'>

3 说明

这里我们用了3次CSS选择器,返回的结果均是符合CSS选择器的节点组成的列表。例如,select('ul li')则是选择所有ul节点下面的所有li节点,结果便是所有的li节点组成的列表。

最后一句打印输出了列表中元素的类型。可以看到,类型依然是Tag类型。

三 嵌套选择

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">Jay</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')
# select()方法同样支持嵌套选择。例如,先选择所有ul节点,再遍历每个ul节点,选择其li节点
for ul in soup.select('ul'):
    print(ul.select('li'))

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
[<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>]

3 说明

可以看到,这里正常输出了所有ul节点下所有li节点组成的列表。

四 获取属性

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">Jay</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')
# 尝试获取每个ul节点的id属性
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
list-1
list-1
list-2
list-2

3 说明

可以看到,直接传入中括号和属性名,以及通过attrs属性获取属性值,都可以成功。

五 获取文本

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">Jay</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')
# 用string属性和get_text()获得结果一样
for li in soup.select('li'):
    print('Get Text:', li.get_text())
    print('String:', li.string)

2 结果

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/4_2.py
Get Text: Foo
String: Foo
Get Text: Bar
String: Bar
Get Text: Jay
String: Jay
Get Text: Foo
String: Foo
Get Text: Bar
String: Bar

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/86409868
今日推荐