【Python3 爬蟲學習筆記】解析庫的使用 7 —— Beautiful Soup 5
阿新 • • 發佈:2018-11-11
CSS選擇器
Beautiful Soup還提供了另外一個選擇器,那就是CSS選擇器。
使用CSS選擇器時,只需要呼叫select()方法,傳入相應的CSS選擇器即可,示例如下:
html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
<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]))
執行結果如下:
[<div class="panel-heading">
<h4>Hello</h4>
<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>]
[<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次CSS選擇器,返回的結果均是符合CSS選擇器的節點組成的列表。例如,select(‘ul li’)則是選擇所有ul節點下面的所有裡節點,結果便是所有的li節點組成的列表。
最後一句列印輸出了列表中元素的型別。可以看到,型別依然是Tag型別。
巢狀選擇
select()方法同樣支援巢狀選擇。例如,先選擇所有ul節點,再裡邊每個ul節點,選擇其li節點,樣例如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
print(ul.select('li'))
執行結果如下:
[<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>]
可以看到,這裡正常輸出了所有ul節點下所有裡節點組成的列表。
獲取屬性
我們知道節點型別是Tag型別,所以獲取屬性還可以用原來的方法。仍然是上面的HTML文字,這裡嘗試獲取每個ul節點的id屬性:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
print(ul['id'])
print(ul.attrs['id'])
執行結果如下:
list-1
list-1
list-2
list-2
可以看到,直接傳入中括號和屬性名,以及通過attrs屬性獲取屬性值,都可以成功。
獲取文字
要獲取文字,當然也可以用前面所提的string屬性。此外,還有一個方法,那就是get_text(),例項如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
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
可以看到,二者效果完全一致。
Beautiful Soup的基本用法總結
- 推薦使用lxml解析庫,必要時使用html.parser。
- 節點選擇篩選功能弱但是速度快。
- 建議使用find()或者find_all()查詢匹配單個結果或者多個結果。
- 如果對CSS選擇器熟悉的話,可以使用select()方法選擇。