1. 程式人生 > >【Python3 爬蟲學習筆記】解析庫的使用 7 —— Beautiful Soup 5

【Python3 爬蟲學習筆記】解析庫的使用 7 —— Beautiful Soup 5

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()方法選擇。