BeautifulSoup
紀錄下 Python 網頁爬蟲大部分會用到的 BeautifulSoup。BeautifulSoup 本質上就是 parser,知道這點後其 function 和 parameter 的使用就能得心應手。
-
Install
這裡紀錄使用 pip 安裝
pip install beautifulsoup4
pip install lxml # 非必要
-
Import
第一行的 import 就可以包含 99%,第二行則是此篇會用的 import,多了 2 個說明用的 object。
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup, NavigableString, Comment
-
Load html
此篇會用第一行來 make soup
soup = BeautifulSoup("<html>a web page</html>", features="html.parser")
soup = BeautifulSoup("<html>a web page</html>", features="lxml") # 如果你有安裝的話
Tag object
Tag object 對應到的就是 XML 跟 HTML 裡的 Tag。
這裡可以從 soup object 下 2 個 Tag 開始,一個是 b 一個是 p。
""" html
<b class="boldest" id="bold man">
<u>Extremely bold</u>
</b>
<p>Just a paragraph</p>
"""
soup = BeautifulSoup(html, 'html.parser')
print(type(soup)) # <class 'bs4.BeautifulSoup'>
print(soup.b) # <b class="boldest" id="bold man"><u>Extremely bold</u></b>
print(soup.p) # <p>Just a paragraph</p>
# Tag 有兩個基礎參數 name 跟 attrs
tag = soup.b
print(type(tag)) # <class 'bs4.element.Tag'>
print(tag.name) # b
print(tag.attrs) # {'class': ['boldest'], 'id': 'bold man'}
# name 跟 attrs 都可以直接修改
tag.name = "d"
tag.attrs = {'class': ['boldest', 'cutest'], 'id': 'pui pui'}
print(str(tag)) # <d class="boldest cutest" id="pui pui"><u>Extremely bold</u></d>
Tag 的 child Tag 可以像 class 的 element 一樣直接呼叫 (上面的 soup.b 和 soup.p 也是一種呼叫 child Tag)
print(str(tag.u)) # <u>Extremely bold</u>
print(tag['class']) # ['boldest', 'cutest']
print(tag['id']) # pui pui
Tag 的 attr 也可以修改和刪除
tag['class'] = ['car']
del tag['id']
print(str(tag)) # <d class="boldest cutest"><u>Extremely bold</u></d>
P.S. HTML 裡的 class 是可以允許多參數的,所以上述的例子裡 class 是 string list,而非 string
NavigableString object
NavigableString 就等於 Tag 裡的 string,可以使用 replace_with 做修改。
tag.u.string.replace_with("No longer bold.")
print(type(tag.u.string)) # <class 'bs4.element.NavigableString'>
print(str(tag.u.string)) # No longer bold.
BeautifulSoup object
其實一開始就有示範了,可以把他想像成沒有 name 和 attributes 的 Tag。但有時候你在 load 真正的 html 檔,他的 name 可能會是 "[document]"。
print(str(soup))
# <d class="car"><u>No longer bold.</u></d><p>123</p>
print(soup.prettify())
# <d class="car">
# <u>
# No longer bold.
# </u>
# </d>
# <p>
# 123
# </p>
參考資料 :
1.Beautiful Soup 4.9.0 documentation