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选择器的简单用法。