乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
CSS选择器

  Beautiful Soup还提供了另外一种选择器——CSS选择器,所以CSS选择器是基于Beautiful Soup的库来实现的。使用CSS选择器只需要调用select方法,传入相应的CSS选择器即可。下面我们通过一个实例来看一下CSS选择有哪些具体用法。

  代码案例如下:

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="listlist-small"id="list-2">
            <liclass="element">Foo</li>
            <liclass="element">Bar</li>
        </ul>
</div>
</div>..

  通过select使用一些常用的方法选择方式

from bs4 import BeautifulSoup
soup= BeautifulSoup(html,"Ixml")
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[o]))

  结果如下: 

运行结果如下:
[<div class="panel-heading">
<h4>Hello</h4>
</div>]
[<li class="element">Foo</li>,<li class="element">Bar</li>, 
 <li class="element">Jay</li>,<liclass="element">Foo</li>,<liclass="element">Bar</li>]
[<liclass="element">Foo</li>,<li class="element">Bar</li>]
<class'bs4.element.Tag'>

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

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

1、嵌套选择

  select方法同样支持嵌套选择,例如先选择所有ul节点,再遍历每个ul节点,选择其li节点,实例如下:

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,"lxm1')
    for ul in soup.select('ul'):
        print(ul.select('li'))

  运行结果如下:

[<li class="element"sFoo</li>,<li class-"element">Bar</li>, <li class="element">Jay</li>]
[<li class-"element"sFoo</li>,<li class="element">Bar</li>]

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

2、获取属性

  既然知道节点是Tag类型,于是获取属性依然可以使用原来的方法。还是基于上面的HTML文本这里尝试获取每个ul节点的id属性。

from bs4 import BeautifulSoup
soup=BeautifulSoup(html,'Ixml')
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

  运行结果如下:

list-1
list-1
list-2
list-2

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

3、获取文本

  要获取文本,当然也可以用前面所讲的string属性。除此之外,还有一个方法,就是get_text.实例如下:

from bs4import BeautifulSoup
soup=BeautifulSoup(html,"1xml")
for li in soup.select('li'):
    print('Get Text:',li.get text())
    print('String:',li.string)

  运行结果如下:

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

  二者的实现效果完全一致,都可以获取节点的文本值。以上就是关于CSS选择器的简单用法。

 

posted on 2023-05-07 20:24  乐之之  阅读(33)  评论(0编辑  收藏  举报